Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Mono中使用预编译的.NET程序集DLL?_C#_.net_Dll_Mono_Assemblies - Fatal编程技术网

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

C# 在Mono中使用预编译的.NET程序集DLL?,c#,.net,dll,mono,assemblies,C#,.net,Dll,Mono,Assemblies,我们目前正在测试Mono,看看我们的.NET DLL是否适用于Linux上的客户。我们的DLL为Windows窗体提供组件。我将DLL放在调试目录中,添加了引用,并创建了一个从Windows窗体派生的类。该类独立运行良好,但在我添加DLL引用并创建一个组件(intellisense运行良好)后,它可以编译,但不会运行: ** (/home/aldwin/testMonoWF/testMonoWF/bin/Debug/testMonoWF.exe:26905): WARNING **: Could

我们目前正在测试Mono,看看我们的.NET DLL是否适用于Linux上的客户。我们的DLL为Windows窗体提供组件。我将DLL放在调试目录中,添加了引用,并创建了一个从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' **(/home/aldwin/testMonoWF/testMonoWF/bin/Debug/testMonoWF.exe:26905):警告**:无法加载文件或程序集“OUR.assembly,Version=1.0.0.1,Culture=neutral,PublicKeyToken=ATOKEN”或其依赖项之一。 未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集'OUR.assembly,Version=1.0.0.1,Culture=neutral,PublicKeyToken=ATOKEN'或其依赖项之一。 文件名:“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 调用方法| P/Invoke方法| P/Invoke库 void OnHandleCreated(EventArgs)| int GoText/comboxcontrol.SetWindowTheme(IntPtr,string,string)| uxtheme.dll 然而,我打开了一个用VS2008创建的示例项目,将DLL的引用指向了正确的位置,它工作得很好。但我无法获得在新项目中工作的参考。我做错什么了吗

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

我将使用测试DLL,以查看它是否使用了不受支持的API。

通过运行以下命令,通常可以获得有关.DLL加载错误的更多详细信息:


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

Jonathan所说的是正确的,您需要运行如图所示的命令,它将产生大量信息

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

gacutil-i OUR.ASSEMBLY.dll


安装它。我们的.ASSEMBLY.dll可能需要其他依赖项,而JPobst命令将显示这些依赖项。

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

uxtheme.DlL
是Windows主题引擎,如果我没有弄错的话。很自然,在非Windows环境中没有这种功能,因此P/调用其导出的函数是不可能的

这里有两个选项:

  • 打开
    OnHandleCreated
    方法,将
    SetWindowTheme
    调用替换为可移植或
  • 创建一个虚拟的
    libuxtheme.so
    ,其中只包含这一个函数,以便mono可以P/调用它
  • 如果可能的话,我推荐第一种方法,因为您需要为您支持的每个平台创建虚拟
    libuxtheme.so
    。也就是说,您必须为x86 Linux创建一个
    libuxtheme.so
    ,为x86_64 Linux创建一个
    libuxtheme.so
    ,为FreeBSD创建一个
    libuxtheme.dylib
    ,为Mac OS X创建一个
    libuxtheme.dylib
    ,等等


    如果
    OnHandleCreated
    是由某个UI设计师或类似人员生成的,您可能需要删除一些小部件主题以摆脱调用。

    刚才添加了上面的MoMA详细信息。不过,它可以与示例应用程序配合使用。只是不能用MonoDevelop创建的新应用程序。你不需要(不应该)在MonoDevelop中重新创建应用程序。Mono应该能够运行在VisualStudio中编译的DLL。我来看看ComboBoxControl.SetWindowsTheme调用——它正在进行p/invoke调用,这意味着Mono不支持它。您可以删除它,还是不使用该控件?我们不想重新创建它-我们正在模拟客户使用dll创建新的应用程序。我只是测试一下,看看这是否是一个dll问题。由于VS-made应用程序能够找到dll并成功运行,因此它似乎不是dll问题。新的应用程序没有调用VS创建的应用程序没有调用的任何东西。感谢您的回答,但是在设置了这些环境变量之后,mono仍然没有给我提供更多信息。虽然我们不使用GAC。当然,但是您对该程序集进行了强式命名,因此mono将在GAC上查找它。出于诊断目的,您可以使用“export MONO_PATH=DIR”覆盖此选项(它将命令MONO在DIR中查找程序集,而不管其强名称如何)。我确保它位于相同的DIR和大小写中,但仍然会导致错误。如果您不通过设置env vars发布输出日志,您可能希望尝试在strace:strace-f-e下执行mono,打开mono yourtest.exe,查看它试图加载的文件和位置。