0

アプリは DLLImport を使用して、従来の管理されていない dll を呼び出します。この質問のために、この dll を Unmanaged.dll と呼びましょう。Unmanaged.dll は、他の 5 つのレガシー DLL に依存しています。従来の dll はすべて、ASP.NET アプリケーションの WebApp/bin/ ディレクトリに配置されています。

IIS が 5.0 分離モードで実行されている場合、アプリは正常に動作します。従来の dll への呼び出しはエラーなしで処理されます。

IIS が既定の 6.0 モードで実行されている場合、アプリは Unmanaged.dll (InitMe()) を開始できますが、後でそれを呼び出すと終了します (ProcessString())。

ここで髪を引っ張っています。管理されていない dll をさまざまな場所に移動し、あらゆる種類のセキュリティ設定を試し、解決策を長い間懸命に探しました。ヘルプ!

サンプルコード:

[DllImport("Unmanaged.dll", EntryPoint="initME", CharSet=System.Runtime.InteropServices.CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
    internal static extern int InitME();
//Calls to InitMe work fine - Unmanaged.dll initiates and writes some entries in a dedicated log file
[DllImport("Unmanaged.dll", EntryPoint="processString", CharSet=System.Runtime.InteropServices.CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
    internal static extern int ProcessString(string inStream, int inLen, StringBuilder outStream, ref int outLen, int maxLen);
//Calls to ProcessString cause the app to crash, without leaving much of a trace that I can find so far

アップデート:

ミニダンプから取得したスタックで戻ります。スタックオーバーフローのようですが、誰かが私を助けてくれるならもっと知りたいです. sos.dll が読み込まれた WinDbg の "kb" の結果:

1beb51fc 7c947cfb 7c82202c 00000002 1beb524c ntdll!KiFastSystemCallRet  
1beb5200 7c82202c 00000002 1beb524c 00000001 ntdll!NtWaitForMultipleObjects+0xc  
WARNING: Stack unwind information not available. Following frames may be wrong.  
1beb52a8 7c822fbe 00000002 1beb52ec 00000000 kernel32!WaitForMultipleObjectsEx+0xd2  
1beb52c4 7a2e1468 00000002 1beb52ec 00000000 kernel32!WaitForMultipleObjects+0x18  
1beb5308 7a2d00c4 7a0c3077 1bc4ffd8 1bc4ffd8 mscorwks!CreateHistoryReader+0x19e9d  
1beb531c 7a0c312f 7a0c3077 1bc4ffd8 888d9fd9 mscorwks!CreateHistoryReader+0x8af9  
1beb5350 7a106b2d 1b2733a0 00000001 1b2733a0 mscorwks!GetCompileInfo+0x345ed  
1beb5378 7a105b91 1b272ff8 1b2733a0 00000001 mscorwks!GetAddrOfContractShutoffFlag+0x93a8  
1beb53e0 7a105d46 1beb5388 1b272ff8 1beb5520 mscorwks!GetAddrOfContractShutoffFlag+0x840c  
1beb5404 79fe29c5 00000001 00000000 00000000 mscorwks!GetAddrOfContractShutoffFlag+0x85c1  
1beb5420 7c948752 1beb5504 1beef9b8 1beb5520 mscorwks!NGenCreateNGenWorker+0x4d52  
1beb5444 7c948723 1beb5504 1beef9b8 1beb5520 ntdll!ExecuteHandler2+0x26  
1beb54ec 7c94855e 1beb1000 1beb5520 1beb5504 ntdll!ExecuteHandler+0x24  
1beb54ec 1c9f2264 1beb1000 1beb5520 1beb5504 ntdll!KiUserExceptionDispatcher+0xe  
1beb57f4 1c92992d 1beb6e28 1db84d70 1db90e28 Unmanaged1!UMgetMaxSmth+0x1200ad  
1beb5860 1c929cfe 00000000 1db84d70 1beb6e28 Unmanaged1!UMgetMaxSmth+0x57776  
1beb58c0 1c930b04 00000000 1db84d70 1beb6e28 Unmanaged1!UMgetMaxSmth+0x57b47  
1beb5924 1c99d088 00000000 1db84d70 1beb6e28 Unmanaged1!UMgetMaxSmth+0x5e94d  
1beb5990 1c99c955 00000000 1beb6e28 1beb6590 Unmanaged1!UMgetMaxSmth+0xcaed1  
1beb5a44 1c99e9ae 00000000 40977000 1db90e28 Unmanaged1!UMgetMaxSmth+0xca79e  
4

4 に答える 4

1

解決策: インポートされた dll を実行する新しいスレッドを作成し、そのスタックにより多くのメモリを割り当てます。

于 2008-10-16T11:37:38.837 に答える
0

procmon、debugdiag を実行し、マイクロソフトのデバッグ ツールを使用してみました。アプリがクラッシュするたびに、ワトソン博士は .dmp と .tmp という 1 組のファイルを作成します (デバッグを試みましたが成功しませんでした)。

イベントログからのエラーは次のとおりです。

イベントの種類: エラー
イベント ソース: .NET ランタイム 2.0 エラー報告
イベント カテゴリ: なし
イベント コード: 1000
日付: 30.09.2008
時刻: 16:13:38
ユーザー: 該当なし
コンピューター: APPLICATIONTEST010
説明:
アプリケーション w3wp.exe、バージョン 6.0で障害が発生しています.3790.3959、スタンプ 45d6968e、エラー モジュール Unmanaged1.dll、バージョン 0.0.0.0、スタンプ 48b6bfb8、デバッグ? 0、障害アドレス 0x00122264。

于 2008-09-30T18:51:06.810 に答える
0

与えられたエラーは何ですか?アプリケーションが本当にクラッシュした場合は、エラーのスタック トレースを取得するために、Windows イベント ログにアクセスする必要がある場合があります。

于 2008-09-30T18:35:23.493 に答える
0

ここで探すべき潜在的な問題は、InitME と ProcessString の呼び出しの間にランタイムによって DLL がアンロードされる可能性があることだと思います。

その解決策は、古き良き LoadLibrary と FreeLibrary を使用して、ランタイムにこれら 2 つの関数の呼び出し間でライブラリをロードしたままにすることです。GetProcAddress は必要ありません (私が知る限り)。

于 2010-03-21T21:05:48.670 に答える