我有一个可以使用Mono c#编译器编译的主C#可执行文件,但EXE使用的是使用P / Invoke和其他单声道不支持的方法的DLL,因此我无法将此DLL编译为Mono。有没有办法使用这些DLL与提前编译单声道可执行文件?
答案 0 :(得分:4)
你的问题有点模糊,因为你似乎在混淆AOT和P / Invoke。 AOT不会调用和缓存P / Invoke调用的结果,事实上,它们彼此无关。
AOT基本上为ILDASM .NET字节码生成本机代码。它与P / Invoke调用无关。 P / Invoke是一个运行时.NET函数,它从本机DLL调用该函数。
与您的帖子相反,Mono完全支持P / Invoke。您的问题不在于Mono,因此Mono AOT无法解决您的问题。您的问题是,您在Mono on下运行应用程序的平台上不支持P / Invoke'd库。没有人可以帮助你;您需要重新实现新平台的本机功能或找到托管替代方案。
答案 1 :(得分:1)
是的,可以AOT编译主可执行文件并仍然可以访问非AOT编译的库。
但是AOT并不是一个混淆机制,特别是你仍然需要原始的主要可执行文件,否则你的程序将无法运行。你想要AOT编译可执行文件/库的唯一原因是在一些非常特殊的场景中使它快一点点。
如果您想要混淆,请查看mkbundle。
答案 2 :(得分:0)
Mono支持pinvoke(如果它没有'它将几乎无用)。 AOT编译的代码仍然可以调用pinvoke方法。您将看到的问题将来自您的目标平台可能不支持的非托管C库(linux?mac?solaris?)
这里有三件事:
前两个链接在上面的链接中有完整的解释,PInvoke是高级.Net / Mono编程的核心,并得到很好的支持。 AOT更常用于Android或IPhone目标
最后一点,你所拥有的库只能在.Net下的窗口上使用,通常涉及Mono没有实现的核心框架方法(你打算调用什么?)或者是围绕windows系统调用的包装器(通常是kernel32.dll)在linux或其他平台上不存在。
您可能还会发现,即使您需要的程序集似乎在单声道上运行,原作者也可能没有注意到使用便携式目录分隔符这样的东西,并且总是假设有一个Windows平台。
我的建议是在您的计划上运行MoMa的新副本并查看其内容。