2009-07-21 62 views
12

我们目前正在测试Mono以查看我们的.NET DLL是否适用于Linux上的客户。我们的DLL为Windows窗体提供组件。我将DLL放在Debug目录中,添加了引用,并创建了一个从Windows窗体派生的类。该上课了运行良好的独立,但之后我加入了DLL引用,并创建了我们的组件之一(智能感知工作得很好),它编译但不会运行:在Mono中使用预编译的.NET程序集DLL?

 
** (/home/aldwin/testMonoWF/testMonoWF/bin/Debug/testMonoWF.exe:26905): WARNING **: Could not load file or assembly 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' or one of its dependencies. 

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' or one of its dependencies. 
File name: 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' 

我看着组件的性能,它就是那个带有该公钥的版本。

有没有办法让我使用这些DLL?我究竟做错了什么?

编辑:

据纽约现代艺术博物馆,比对情况没有影响一些[MonoTodo] S以外,还有三个在DLL中的一个问题:

 
Calling Method | P/Invoke Method | P/Invoke Library 
void OnHandleCreated (EventArgs) | int GoText/ComboBoxControl.SetWindowTheme (IntPtr, string, string) | uxtheme.dll 

不过,我打开我们使用VS2008创建的示例项目之一,在正确的位置指向了DLL的引用,并且它工作正常。但我无法获得参考在新项目中工作。难道我做错了什么?

编辑2: 为了澄清,我们不想重新创建现有的Windows应用程序 - 我们正在模拟客户使用我们的dll创建新的应用程序。我只是测试,看看这是否是一个DLL问题。由于VS制作的应用程序能够找到dll并成功运行,它似乎不是一个dll问题。新的应用程序不会调用VS创建的应用程序没有的任何东西。

回答

9

我会用MOMA (Mono Migration Analyzer)来测试DLL,看看它是否使用不支持的API。

+0

刚刚在上面添加了MoMA详细信息。不过,它可以很好地与示例应用程序一起运行只是不适用于使用MonoDevelop制作的新创建的应用程序。 – NickAldwin 2009-07-21 19:49:20

+0

您不需要(不应该)需要在MonoDevelop中重新创建应用程序。 Mono应该能够运行在Visual Studio中编译的DLL。我会看看ComboBoxControl.SetWindowsTheme调用 - 这是进行p/invoke调用,这意味着它不会在Mono中受支持。你可以删除它,或不使用该控件? – 2009-07-21 20:08:43

+0

我们不想重新创建它 - 我们正在模拟客户使用我们的dll创建新的应用程序。我只是测试,看看这是否是一个DLL问题。由于VS制作的应用程序能够找到dll并成功运行,它似乎不是一个dll问题。新的应用程序不会调用VS创建的应用程序没有的任何东西。 – NickAldwin 2009-07-21 20:26:41

4

您可以通过运行通常坐上.dll文件加载错误的详细信息:

MONO_LOG_LEVEL =“调试” MONO_LOG_MASK =“DLL”单程序myapp.exe

+0

感谢您的回答,但设置了单声道环境变量后,仍然没有给我任何更多信息。 – NickAldwin 2009-07-21 20:35:25

6

什么乔纳森说是正确的,你需要运行命令如图所示,它会产生大量的信息。

该程序集有一个很强的名称,所以听起来像在Windows上,您有一个安装在GAC上的依赖项。如果 “OUR.ASSEMBLY” 应该是有,运行:

GACUTIL -i OUR.ASSEMBLY.dll

要安装它。 OUR.ASSEMBLY.dll可能存在其他依赖项,这是JPobst的命令将显示的内容。

4

可能的问题是程序集没有放在与程序相同的目录中,或者程序集文件名的区分大小写在复制时未保留。 例如,您可能有OUR.ASSEMLY引用,但文件名是OurAssembly.DlL或任何其他无效的案例组合,人们可以提出。

1

uxtheme.dll是Windows的主题引擎,如果我没有弄错的话。在非Windows环境中这是非常自然的,所以P /调用其导出的函数不是直接可能的。

你这里有两种选择:

  1. 打开该OnHandleCreated方法并替换SetWindowTheme调用的东西便携式或
  2. 创建一个虚拟libuxtheme.so只包含这一个功能,所以单可以P/Invoke它。

如果可能的话,我推荐第一种方法,因为您需要为您支持的每个平台创建虚拟libuxtheme.so。也就是说,你必须为x86 Linux制作libuxtheme.so,x86_64 Linux制作libuxtheme.so,FreeBSD制作相同,Mac OS X制作libuxtheme.dylib等等。

如果OnHandleCreated是由某个UI设计人员等生成的,那么您可能必须删除一些控件主题,才能删除该调用。