インポートされたメソッドを使用すると、ASP.NETでDllが読み込まれ、ファイルの使用が終了した後でもファイルがロックされるため、DllImportとASP.NETにいくつかの問題があります。 ASP.NETがファイルのロックを解除するように強制する方法はありますか?DllImportとASP.NET
3
A
答えて
2
.NETでプロセスからDLLを強制的に削除する唯一の方法は、DLLがロードされているAppDomainをアンロードすることです。 DllImportコードを実行する別のAppDomainを作成しない限り、これは可能ではありません。
また、私はこのポリシーがマネージドDLLに適用されることを知っています。私はこれがDLLのPINvoke経由でロードされる場合は100%確信していませんが、私はかなり確信しています。
2
新しいAppDomainを作成し、dllをドメインにロードする場合のみ。その後、AppDomainをアンロードすると、dllがアンロードされます。
0
AppDomainのアンロードは唯一の答えではありません。ピンボケを使用してLoadLibrary
とFreeLibrary
を使用してライブラリをアンロードすることもできます。 FreeLibrary
を2回呼び出して、ライブラリの依存関係もアンロードされるようにしてください。
私はこれをテストしていませんが、私はこのようなクラスは、より簡単にこれを行うことになるだろうと想像:
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr LoadLibrary(string libname);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern bool FreeLibrary(IntPtr hModule);
class LibraryHandle
{
readonly string libName;
int refCount = 0;
IntPtr handle;
public LibraryHandle(string name)
{
libName = name;
}
public void Increment()
{
if (refCount == 0)
{
handle = LoadLibrary(libName);
if (Handle == IntPtr.Zero)
{
int error = Marshal.GetLastWin32Error();
throw new Exception(string.Format("{0})", error));
}
}
++refCount;
}
public void Decrement()
{
if (refCount <= 0)
return;
if (--refCount)
{
// It might be better in some cases to:
// while(FreeLibrary(handle));
FreeLibrary(handle);
FreeLibrary(handle);
}
}
}
はちょうどこの例は、あなたがしたいと思うこれは、安全なスレッドされていないことを警告しますASP.NETで保証され、完全なエラーチェックは行われません。
また、ランタイムによって行われたいくつかの前提条件に違反する可能性があるため、ロードしていないライブラリでFreeLibrary
を使用することはお勧めできません。
もう1つの方法は、新しいAppDomain
の操作を実行し、完了したらアンロードすることです。
関連する問題
- 1. P /呼び出し[DLLIMPORT] ASP.NET
- 2. Asp.Net C#DllImportの問題
- 3. DllImport user32とuser32.dll
- 4. DllImportパーミッション
- 5. DllImport StackOverflowException
- 6. dllimportとdllexportの間のリンク
- 7. C#DLLIMPORTトラブル
- 8. C#のDLLIMPORT質問
- 9. dllexport/dllimportスイッチのマクロ
- 10. Vista DLLImport問題C#
- 11. C#DllImport help(Mac OS)
- 12. パラメータbei DLLImport from C#
- 13. __declspec(dllimportの/のdllexport)と継承
- 14. dllimportとキーボードフックの使い方の理解
- 15. [DllImport( "QCall")]とは何ですか?
- 16. dllexportとdllimportの違いは何ですか?
- 17. C#:DllImportと継承を結合しますか?
- 18. __declspec(dllimport)の正しい使い方
- 19. マネージコールバックをDllImport(ed)関数に渡す
- 20. <DllImport( "XYZdll")>のDllのデフォルトパス>
- 21. DLLImportでのC#エラーの発見方法
- 22. SQL ServerのようなPostgres dllimport
- 23. DllImport PathCanonicalize 64ビットでメモリ破損が発生する
- 24. MacのMonoでDllImportを使用したDllNotFoundException:間違ったアーキテクチャ
- 25. 変更C#DLLIMPORTターゲットコードのx64に応じて/ x86の
- 26. アセンブリからすべてのDLLImportを取得しますか?
- 27. dllImportを抽出するツールはありますか?
- 28. DLLImportコールでIIS 7.5エラーが発生しました
- 29. dllimportがdllを読み込めません
- 30. DllImport nullで終了した文字列を返すAccessViolationException
私の場合、ピンボケ付きのdllで動作しませんでした。 dllに依存することがあります。 – Sire