簡體   English   中英

是否可以使用Mono AOT編譯(本機)c#可執行文件和C#Dll(CIL)(未實現Mono方法)

[英]Is it Possible to use Mono AOT Compiled (Native)c# Executable and C# Dll(CIL) which has unimplemented Mono Methods

我有一個主要的C#可執行文件,可以使用Mono c#編譯器進行編譯,但是EXE使用的DLL使用P / Invoke和其他不支持Mono的方法,因此我無法將此DLL編譯為Mono。 有什么方法可以將這些DLL與提前編譯的Mono可執行文件一起使用嗎?

您的問題有點含糊,因為您似乎正在混淆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庫。 沒有人可以在這里為您提供幫助; 您將需要為新平台重新實現本機功能,或者找到托管替代品。

是的,可以對主要可執行文件進行AOT編譯,而仍然可以訪問非AOT編譯的庫。

但是AOT並不是一種混淆機制,特別是您仍然需要原始的主要可執行文件,否則您的程序將無法運行。 您要AOT編譯可執行文件/庫的唯一原因是,在某些非常特定的情況下,使其稍微快一點。

如果要混淆,請查看mkbundle

Mono支持pinvoke(如果沒有,則幾乎沒有用)。 AOT編譯的代碼仍然可以調用pinvoke方法。 您將看到的問題將來自目標平台可能不支持的非托管C庫(Linux?mac?solaris?)

您在這里有三件事:

前兩個鏈接在上面的鏈接中進行了詳細說明,PInvoke是高級.Net / Mono編程的核心,並且得到了很好的支持。 AOT在AndroidiPhone目標中更常使用

最后一點,您擁有的庫僅在.Net下的Windows上可用,通常涉及Mono不會實現的核心框架方法(您要調用的是什么?)或Windows系統調用的包裝器(通常在kernel32.dll中) )在Linux或其他平台上不存在。

您可能還會發現,即使您所需的程序集似乎在mono上運行,原始作者也可能沒有注意使用可移植目錄分隔符之類的東西,並且始終假定使用Windows平台。

我的建議是在您的程序上運行MoMo的新副本,然后查看其內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM