7

私の C# アプリケーション (.NET Framework 4.0) は、次のコードで外部のアンマネージ DLL をインポートします。

[DllImport("myDLL.dll"), EntryPoint="GetLastErrorText"]
private static extern IntPtr GetLastErrorText();

残念ながら、サードパーティの DLL にバグがあるようです。回避策として、DLL をアンロードしてから再ロードする必要があります。これどうやってするの?いくつかの投稿を見てきましたが、それらはすべてマネージ DLL について語っています。

4

3 に答える 3

5

ライブラリへのアクセスを管理するラッパーをライブラリに書き込むことができます。次に、ネイティブメソッドを使用してライブラリを呼び出すことができます。このブログ投稿をご覧ください。

于 2012-12-20T08:00:33.323 に答える
4

以下の dllimport と getProcAddress の違い: 省略されたサンプル (エラー処理なし)に示すように、LoadLibrary/FreeLibrary/GetProcAddress を使用する必要があると思います。

   [UnmanagedFunctionPointer(CallingConvention.StdCall)]
   private delegate Bool BarType(Byte arg); 
   ...
   IntPtr pDll= LoadLibrary("foo.dll");
   IntPtr pfunc = GetProcAddress(pDll, "bar");
   BarType bar = (BarType)Marshal.GetDelegateForFunctionPointer(pFunc, typeof(BarType));
   var ok = bar(arg);
   FreeLibrary(pDll);
于 2012-12-20T08:01:58.760 に答える
2

DllImportを使用してDLLをインポートするのではなく、LoadModule(WinAPIから)を使用してインポートし、関数を呼び出してアンロード/リロードする限り、必要なことを使用GetProcAddressして実行することができます。FreeLibrary

こちらをご覧ください。

C ++ / CLRを使用してC#とアンマネージDLLを接着する場合は、少しきれいで管理しやすいかもしれません。

于 2012-12-20T08:00:21.707 に答える