在Mono中使用预编译的.NET程序集DLL?

时间:2009-07-21 17:59:40

标签: c# .net dll mono assemblies

我们目前正在测试Mono,看看我们的.NET DLL是否适用于Linux上的客户。我们的DLL为Windows窗体提供组件。我将DLL放在Debug目录中,添加了引用,并创建了一个从Windows窗体派生的类。这个类运行得很好,但是在我添加了DLL引用并创建了一个组件(intellisense工作正常)后,它编译但不会运行:

** (/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]外,其中三个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创建的应用程序所没有的任何内容。

5 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:6)

Jonathan说的是正确的,你需要按照所示运行命令,它会产生大量的信息。

程序集具有强名称,因此在Windows上听起来像是在GAC上安装了依赖项。如果“OUR.ASSEMBLY”应该在那里,请运行:

gacutil -i OUR.ASSEMBLY.dll

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

答案 2 :(得分:4)

通过运行:

,您通常可以获得有关.dll加载错误的更多详细信息

MONO_LOG_LEVEL =“debug”MONO_LOG_MASK =“dll”mono myapp.exe

答案 3 :(得分:4)

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

答案 4 :(得分:1)

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

这里有两个选项:

  1. 打开OnHandleCreated方法并将SetWindowTheme来电替换为便携式或
  2. 创建一个虚拟libuxtheme.so,其中只包含这一个函数,因此mono可以P / Invoke它。
  3. 我推荐第一种方法,因为您需要为您支持的每个平台创建虚拟libuxtheme.so。即,您必须为x86 Linux制作libuxtheme.so,为x86_64 Linux制作libuxtheme.so,对于FreeBSD制作同样的libuxtheme.dylib,对Mac OS X制作OnHandleCreated等等。

    如果{{1}}是由某个UI设计师等生成的,您可能必须删除一些小部件主题以消除该调用。