5

私が取り組んでいる AC# WPF アプリケーションには、管理されていない外部 DLL への多くの呼び出しが含まれています。アプリケーションを正常に実行している場合 (つまり、Visual Studio デバッガーの外部)、DLL へのすべての呼び出しは期待どおりに機能します。ただし、Visual Studio 2013 内からデバッグする場合、DLL 内の 1 つの特定のメソッドを呼び出すと、アプリケーションがクラッシュします。

vshost32.exe が動作を停止しました

これは私がメソッドをインポートする方法です:

[DllImport("Client.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern string ClientGetVersion();

...そして、これは私がDLLメソッドを呼び出す方法です:

try
{
  version = ClientGetVersion();
}
catch (Exception ex)
{
  // Error handling omitted for clarity...
}

Visual Studio は、デバッグ セッション中に vshost32.exe プロセスを使用してアプリケーションをホストしているようです ( VSHOST - ホスティング プロセス)。さらに、「ホスティング プロセスが有効になっていると、特定の API の呼び出しが影響を受ける可能性があります。このような場合、正しい結果を返すには、ホスティング プロセスを無効にする必要があります。」(MSDN の記事「方法: ホスティング プロセスを無効にする」を参照してください)。以下に示すように、[プロジェクト] > [プロパティ...] > [デバッグ] で [Visual Studio ホスティング プロセスを有効にする] オプションを無効にすると、実際に問題が解決されます。

ここに画像の説明を入力

「...特定のAPIへの呼び出し...」でこの問題を具体的に引き起こす可能性のあるものは何か知っていますか?

4

2 に答える 2

1

vshost32.exe エラーは、不適切な DllImport ステートメントが原因で発生します。外部 DLL の戻り値の型を文字列にすることはできません。IntPtr にする必要があります。

修正されたコードは次のとおりです。

[DllImport("Client.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr ClientGetVersion();

...そして、これは DLL メソッドへの改訂された呼び出しです。

string version;

try
{
  version = Marshal.PtrToStringAnsi(ClientGetVersion());

}
catch (Exception ex)
{
  // Error handling omitted for clarity...
}

答えてくれた@HansPassantに感謝します。

于 2016-03-22T12:31:53.903 に答える
0

Visual Studio を終了し、管理者モードで再起動します。それは働く!!!

于 2016-09-23T19:45:31.723 に答える