我们目前正在测试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?我究竟做错了什么?
编辑:
根据MoMA的说法,除了一些与情况无关的[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 回答
我用MOMA (Mono Migration Analyzer)测试DLL,看它是否's using unsupported API' .
乔纳森所说的是正确的,你需要按照所示运行命令,它会产生大量的信息 .
程序集具有强大的名称,因此在Windows上听起来像是在GAC上安装了依赖项 . 如果“OUR.ASSEMBLY”应该在那里,请运行:
gacutil -i OUR.ASSEMBLY.dll
安装它 . 可能还有OUR.ASSEMBLY.dll需要的其他依赖项,这是JPobst'命令将显示的内容 .
您可以通过运行以下命令获取有关.dll加载错误的更多详细信息:
MONO_LOG_LEVEL =“debug”MONO_LOG_MASK =“dll”mono myapp.exe
可能的问题是程序集不与程序放在同一目录中,或者在复制时不保留程序集文件名的区分大小写 . 例如,您可能有一个OUR.ASSEMLY引用,但文件名是OurAssembly.DlL或人们可以提出的任何其他无效案例组合 .
uxtheme.dll
是Windows主题引擎,如果我非常自然地在非Windows环境中没有它,那么P /调用其导出的函数是不可能的 .你有两个选择:
打开
OnHandleCreated
方法并用便携式或 . 替换SetWindowTheme
调用创建一个虚拟
libuxtheme.so
,它只包含这一个函数,因此mono可以P / Invoke它 .如果可能的话,我建议使用第一种方法,因为你需要为每个平台创建虚拟
libuxtheme.so
,你需要为x86 Linux创建一个libuxtheme.so
,为x86_64 Linux创建一个libuxtheme.so
,为FreeBSD创建相同的libuxtheme.dylib
,为Mac OS X创建一个libuxtheme.dylib
等等 .如果
OnHandleCreated
是由某个UI设计者等生成的,则可能必须删除一些小部件主题以消除调用 .