ubuntu上带有mono的C#dll导入:不向dll收费

C# DLLimport with mono on ubuntu: not charging dll

本文关键字:导入 不向 dll 收费 C#dll mono ubuntu      更新时间:2023-10-16

大家早上好我正在用Visual Studio 2017用C#语言开发一个可执行软件myExe.exe,它将在带有ubuntu 14.04和mono的PC上运行我需要使用一个DLL,我们可以称之为dll2import.DLL,用于通过TCP/IP与特定设备(如驱动程序…)进行工作。为了避免对一些无用的细节感到无聊,我只写重要的信息(但如果你需要的话,请随意询问)和一个简单的例子。

在C++dll2import.dll中,我有第一个创建处理程序的函数,名为d2iCreate,我用这种方式包装它:

//private const String dllPath = @"D:ExtDll2Usedll2import.dll";
//private const String dllPath = "/home/massi/dll2import.dll";
private const String dllPath = "dll2import.dll";
[DllImport(dllPath,EntryPoint = "d2iCreate",CallingConvention = CallingConvention.Cdecl)]
unsafe public static extern UInt32 CSd2iCreate(); 

我用类似的方式包装了许多其他函数,但问题是从这个开始的,所以写所有的。。。

当我用电脑运行.exe时,一切都很好!!!但当我用ubuntu把这个应用程序放在我的电脑上,并尝试用mono运行它时。。出现问题!!!我的代码进入异常caling CSd2iCreate()!!!就像它没有找到图书馆一样。。。。我尝试了好几条路都没有成功。。。我试着把库(和路径)放在我的主目录、根目录和.exe所在的位置。。。。但它就像mono不使用它!这很奇怪,因为如果我删除dll2import.dll,错误不会改变。。所以这就像mono没有找到.dll……我可以告诉你,我使用了其他.dll,它们可以工作,但.dll是在visual studio中开发的c#项目,并链接到我的项目中。。所以我想我必须在mono内部配置一些东西,或者用其他方式安装那个库,但我不知道怎么做!

.dll是按原样提供的,我没有源代码。。。我无法重新编译它…

如果可以的话,我在这里写错误,但不是很详细,这是一个通用的错误。

代码是:

private unsafe bool CreateHandler() {
try {
pwxHandle = d2iCreate();
return true;
} catch(Exception ex) {
Log.Errore(pwxProcLog,System.Reflection.MethodBase.GetCurrentMethod().Name,"Error creating Handler",ex);
return false;
}
}

日志错误代码的例程是(摘录):

public void Errore(string Proc, string Metodo, string info, Exception e)
{
ScriviErr(Proc, Metodo, info);
ScriviErr(Proc, "Eccezione " + e.Source, e.Message);
ScriviErr(Proc, "Stack", Environment.NewLine + e.StackTrace + Environment.NewLine);        
}
}

所以记录的错误是:

14/11/2017-17.38.23 <WV1> - CreateHandler: [Error creating Handler]
14/11/2017-17.38.23 <WV1> - Eccezione MyProject2LinkDLL: [dll2import.dll]
14/11/2017-17.38.23 <WV1> - Stack: [
at (wrapper managed-to-native) MyProject2LinkDLL.Perif:d2iCreate ()
at MyProject2LinkDLL.Perif.CreateHandler () [0x00000] in <filename unknown>:0 
]

我可以告诉你,在这一行:

14/11/2017-17.38.23 <WV1> - Eccezione MyProject2LinkDLL: [dll2import.dll]

在[]之间有我为take library写的路径。。。所以其他时间是错误

14/11/2017-14.11.37 <WV1> - Eccezione MyProject2LinkDLL: [/home/massi/dll2import.dll]

如果需要其他细节,请随时询问!

谢谢,Massimiliano

不是一个完整的答案,但我记得在很久以前重用的DLL中遇到过这个问题。从本质上讲,你已经了解了你正在使用的架构:

单声道本地使用。Net库,具有调用*nix函数进行本地交互的外观。因此,P/Invoke调用使用操作系统来尝试和加载东西。这意味着windows编译的dll无法正确链接,因为它将尝试通过*nix加载库调用加载。

wine中有一个项目,针对wine库编译mono运行时(本质上是.net实际要运行的),但使用wine实现提供的外观。这意味着您可以调用WINE中的可执行文件,因为它将加载(通过WINE)并正确链接到WINE库。我没有用过,所以我不知道它是成熟葡萄酒-Mono

如果你不接触系统中未实现/未工作的部分,这可能会起作用,即使这样,也有很多移动部件,你可能会遇到各种集成问题。XP的100美元许可证会让你在windows上运行它吗?

这里的文章有一些非常详细的信息p/InvokeMono。