私の問題とプロセスを完全に説明します。私は他のゲームのエディターを作成していましたが、通信している C 言語で記述されたラッパー DLL が 1 つあります。
DllImport
最初は、DLL から関数を呼び出すメソッドのリストがありました。最初のメソッドはCSharp_new_CEditorInterface
、IntPtr
. 次に、グラフィックスを描画するウィンドウ コントロールへのハンドルCSharp_CEditorInterface_CreateApp
を取得します。ulong
最後に and を呼び出す必要がCSharp_CEditorInterface_CloseApp
ありCSharp_delete_CEditorInterface
ます。これらのメソッドは、HandleRef
から返された with ポインタを受け取りますCSharp_new_CEditorInterface
。
ただし、メソッドの作成と削除を複数回呼び出す必要がありCSharp_CEditorInterface_CreateApp
、2 回目に呼び出すと、 がスローされましたSystem.AccessViolationException
。そこで、LoadLibrary と FreeLibrary を使用して DLL を動的にロードおよびアンロードすることにしました。リフレクションを使用してすべての p/invoke メソッドを参照し、デリゲート、読み取り専用フィールド、GetProcAddress で構成されるコードを生成するアプリケーションを作成しました。しかし、私が知ったように、エントリ ポイントは部分的なものに過ぎませんでした。CSharp_new_CEditorInterface
でした_CSharp_new_CEditorInterface@0
。DLL エクスポート ビューアーを使用して、すべての完全な関数名を保存し、その中で検索しました。コンストラクターでは、適切な関数を呼び出しLoadLibrary
てロードします。にDispose
、ありましたFreeLibrary
。
このソリューションは正常に機能し、関数は OK と呼ばれていましたが、文字列を返す一部の関数が をスローしていることに気付きAccessViolationException
ました。メソッドを使用する場合、それらは正常に機能しDllImport
ます。また、静的クラスから任意の関数を呼び出して別のモジュールをロードすると、問題のある関数を呼び出しても問題なく、適切な値が返されることも発見しました。ただし、DLL を動的にアンロードして再ロードした後、再び動作せず、どの例外がスローされたかを推測します。
次に、どの関数をどの順序で呼び出すか:
--When initializing--
LoadLibrary(string) (winapi)
--bunch of GetProcAddress, Marshal.GetDelegateForFunctionPointer--
new_CEditorInterface() (from DLL)
CreateApp(HandleRef, ulong) (from DLL)
--When closing in Dispose--
CloseApp(HandleRef) (from DLL)
delete_CEditorInterface(HandleRef) (from DLL)
FreeLibrary(IntPtr) (winapi)
DLL は、一度に複数ロードされるように作成されていないことに注意してください。
誰か助けてくれませんか?