在 ubuntu 上使用 mono 的 C# DLLimport:不收取 dll
Posted
技术标签:
【中文标题】在 ubuntu 上使用 mono 的 C# DLLimport:不收取 dll【英文标题】:C# DLLimport with mono on ubuntu: not charging dll 【发布时间】:2017-11-15 08:38:21 【问题描述】:大家早上好 我正在使用 C# 语言使用 Visual Studio 2017 开发一个可执行软件 myExe.exe,它将在带有单声道的 ubuntu 14.04 的 PC 上运行 我需要使用一个 DLL,我们可以称之为 dll2import.dll,通过 TCP/IP 与特定设备(如驱动程序......)一起工作。 为了避免对一些无用的细节感到无聊,我只写了重要的信息(但如果您需要随时询问)和一个简单的示例。
在 C++ dll2import.dll 中,我有第一个函数来创建处理对象的处理程序,称为 d2iCreate,我以这种方式包装它:
//private const String dllPath = @"D:\ExtDll2Use\dll2import.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 把这个应用程序放在我的电脑上并尝试用单声道运行它时,出现了问题!!!我的代码进入异常调用 CSd2iCreate() !!!喜欢它没有找到库......我尝试了几个路径但没有成功......我尝试将库(和路径)放在我的主目录中,在我的根目录中,以及存在 .exe 的位置......但它是喜欢mono就不用了吧! 这很奇怪,因为如果我删除 dll2import.dll 错误不会改变..所以就像单声道没有找到 .dll ......我可以告诉你我使用其他 .dll 并且它们可以工作但 .dll 是c# 项目在 Visual Studio 中开发并链接到我的项目中.. 所以我想我必须在 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]
在 [] 之间有我为拍摄库编写的路径...所以其他时间是错误
14/11/2017-14.11.37 <WV1> - Eccezione MyProject2LinkDLL: [/home/massi/dll2import.dll]
如果需要其他详细信息,请随时询问!
谢谢, 马西米利亚诺
【问题讨论】:
您是否在 Ubuntu 下编译了您的 C++ 库并创建了一个共享库,即dll2import.so
?
您可能会遇到错误消息。你必须养成分享的习惯。
您好,感谢您的回答。这个库是“按原样”提供的,我没有源代码......所以我无法重新编译。我的项目是“Visual Studio 控制台应用程序”。错误消息是通用的,我刚刚添加了我的问题,谢谢
【参考方案1】:
不是一个完整的答案,但我记得在很久以前我重用的 DLL 中遇到过这个问题。基本上你已经了解你正在使用的架构:
Mono 本机使用 .Net 库,通过外观调用 *nix 函数进行本机交互。因此,P/Invoke 调用使用操作系统来尝试加载内容。这意味着 Windows 编译的 dll 根本无法正确链接,因为它会尝试通过 *nix 加载库调用来加载。
wine 中有一个项目可以针对 wine 库编译单声道运行时(本质上是 .net 实际打算运行的),但使用 wine 实现提供的外观。这意味着您可以在 WINE 中调用可执行文件,因为它将加载(通过 wine)并正确链接到 wine 库。没用过不知道成熟度Wine - Mono
如果您不触及系统中未实现/非工作部分的某些部分,这可能会起作用,即使那样,仍有很多活动部分可能会遇到各种集成问题。 100 美元的 XP 许可证会让你在 Windows 上运行它吗?
这里的文章有一些非常详细的信息P/Invoke Mono。
【讨论】:
您好,感谢您的回答。你的解释很好,我会尽快尝试使用wine,但我不知道它是否可能......原因是因为我没有使用windows:我有所有其他系统运行linux,如果有一些linux会很糟糕和相同的窗口......通过 ssh 使用 linux 比使用 windows 更好以上是关于在 ubuntu 上使用 mono 的 C# DLLimport:不收取 dll的主要内容,如果未能解决你的问题,请参考以下文章
在ubuntu下mono编译一个github上的C#项目出现CS0518的错误 提示没有.NET4 runtime