在 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的主要内容,如果未能解决你的问题,请参考以下文章

在mono中使用c#驱动程序比较mongo集合的两个字段

在ubuntu下mono编译一个github上的C#项目出现CS0518的错误 提示没有.NET4 runtime

在 Ubuntu 上使用 VSCode 编译 C# 项目

使用 Mono 的 C# 代码中的间歇性 SIGSEGV (segfault)、SIGABRT 和进程挂起

PS3 上 Mono 的开发资源

如何在 Ubuntu 上安装最新版本的 Mono 和 MonoDevelop?