Mono c#コンパイラを使用してコンパイルできるメインのC#実行可能ファイルがありますが、EXEはP / Invokeおよびその他のサポートされていないmonoメソッドを使用するDLLを使用するため、このDLLをMonoにコンパイルできません。これらのDLLをAheadofTime Compiled Mono Executableで使用する方法はありますか?
3 に答える
AOTとP/Invokeを混同しているように見えるため、質問は少しあいまいです。AOTは、P / Invoke呼び出しの結果を呼び出したりキャッシュしたりしません。実際、これらは互いに関係がありません。
AOTは基本的に、ILDASM.NETバイトコードのネイティブコードを生成します。P/Invoke呼び出しとは何の関係もありません。P / Invokeは、ネイティブDLLから関数を呼び出すランタイム.NET関数です。
あなたの投稿とは異なり、MonoはP/Invokeを完全にサポートしています。あなたの問題はMonoにあるのではないので、MonoAOTがあなたの問題を解決するためにできることは何もありません。問題は、P / Invokeされているライブラリが、Monoでアプリケーションを実行しているプラットフォームでサポートされていないことです。ここでは誰もあなたを助けることはできません。新しいプラットフォームのネイティブ機能を再実装するか、管理された代替機能を見つける必要があります。
はい、メインの実行可能ファイルをAOTコンパイルしても、AOTコンパイルされていないライブラリにアクセスすることは可能です。
ただし、AOTは難読化メカニズムを意図したものではありません。特に、元のメイン実行可能ファイルが必要です。そうしないと、プログラムが実行されません。実行可能ファイル/ライブラリをAOTコンパイルする唯一の理由は、いくつかの非常に特殊なシナリオでそれを少し速くすることです。
難読化したい場合は、mkbundleをご覧ください。
Monoはpinvokeをサポートしています(サポートしていなければ、ほとんど役に立たないでしょう)。AOTでコンパイルされたコードは、引き続きpinvokeメソッドを呼び出すことができます。表示される問題は、ターゲットプラットフォーム(linux?mac?solaris?)でサポートされていない可能性のあるアンマネージCライブラリから発生します。
ここには3つのものがあります。
最初の2つは、上記のリンクで完全に説明されています。PInvokeは、高度な.Net / Monoプログラミングの中核であり、十分にサポートされています。AOTは、 AndroidまたはiPhoneのターゲットでより頻繁に使用されます
最後のポイントは、.NetのWindowsでのみライブラリを利用できる場合、通常、Monoが実装していないコアフレームワークメソッド(何を呼び出そうとしているのか)、またはWindowsシステムコールのラッパー(多くの場合kernel32.dll)が含まれます。 )Linuxまたは他のプラットフォームには存在しません。
また、必要なアセンブリがモノラルで実行されているように見えても、元の作成者がポータブルディレクトリ区切り文字の使用などに注意を払っていない可能性があり、常にWindowsプラットフォームを想定している場合もあります。
私のアドバイスは、あなたのプログラムでMoMaの新しいコピーを実行し、それが何を言っているかを確認することです。