是否可以使用Mono AOT编译(Native)c#可执行文件和C# Dll(CIL),其中有未实现的Mono方法



我有一个主要的C#可执行文件,可以使用Mono c#编译器进行编译,但是EXE使用使用P/Invoke和其他不支持的单声道方法的DLL,所以我无法将此DLL编译为Mono。 有没有办法将这些 DLL 与提前编译的单声道可执行文件一起使用?

你的问题有点模糊,因为你似乎把AOT和P/Invoke混为一谈。AOT 不会调用和缓存 P/Invoke 调用的结果,事实上,它们彼此无关。

AOT 基本上为 ILDASM .NET 字节码生成本机代码。它与 P/Invoke 调用无关。P/Invoke 是一个运行时 .NET 函数,它从本机 DLL 调用该函数。

与您的帖子相反,Mono完全支持P/Invoke。您的问题不在于单声道,因此单声道AOT无法解决您的问题。您的问题是,在 Mono 下运行应用程序的平台上不支持 P/Invoke'd 的库。这里没有人能帮助你;您需要为新平台重新实现本机函数或找到托管替代方案。

是的,可以AOT编译主可执行文件,但仍可以访问非AOT编译的库。

但是AOT并不意味着是一种混淆机制,特别是你仍然需要原始的主可执行文件,否则你的程序将无法运行。您想要AOT编译可执行文件/库的唯一原因是在一些非常特定的情况下使其更快一点。

如果你想混淆,看看 mkbundle。

Mono 支持 pinvoke(如果没有,它几乎毫无用处(。AOT 编译的代码仍然可以调用 pinvoke 方法。您将看到的问题将来自目标平台可能不支持的非托管 C 库(linux?mac?solaris?(

您这里有三件事:

  • AOT
  • PInvoke
  • 仅 .Net 库

前两个在上面的链接中有充分的解释,PInvoke是高级.Net/Mono编程的核心,并且得到了很好的支持。AOT更常用于Android或iPhone目标

最后一点,你拥有的库只在.Net下的Windows上可用,通常涉及Mono没有实现的核心框架方法(你想叫什么?(,或者是Windows系统调用的包装器(通常在kernel32中.dll(,这些调用在Linux或其他平台上不存在。

您可能还会发现,即使您需要的程序集似乎在 mono 上运行,原始作者也可能没有注意诸如使用可移植目录分隔符之类的事情,并且始终假定使用 Windows 平台。

我的建议是在你的程序上运行一个新的MoMa副本,看看它说了什么。

最新更新