2016-03-22 12 views
5

C#のWPFアプリケーション私は、アンマネージの外部DLLへの多くの呼び出しが含まれています。アプリケーションを正常に実行すると(つまり、Visual Studioデバッガの外部で)、DLLへのすべての呼び出しが正常に機能します。 Visual Studioの2013内からデバッグするときただし、DLL内の1つの特定のメソッドの呼び出しは、アプリケーションをクラッシュ:Visual Studio 2013で「vshost32.exeが動作を停止しました」原因が考えられますか?

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

...と:

vshost32.exe has stopped working

これは私がメソッドをインポートする方法ですVisual Studioがデバッグ中にアプリケーションをホストするvshost32.exeプロセスを使用していることを思わ

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

:これは私がDLLのメソッドを呼び出す方法ですgingセッション(VSHOST - the Hosting Process)。さらに、「特定のAPIへの呼び出しは、ホスティングプロセスが有効な場合に影響を受ける可能性があります。このような場合、正しい結果を返すためにホスティングプロセスを無効にする必要があります。 (MSDNの記事How to: Disable the Hosting Processを参照してください)。誰もがこれを具体的に引き起こす可能性がどのような任意のアイデアを持ってい

enter image description here

:以下に示すように、プロジェクトでは、「Visual Studioのホストプロセスを有効にする」オプションを無効にする]> [プロパティ...>デバッグは、実際に問題を解決しません「...特定のAPIへの呼び出し...」で問題が発生しましたか?

+1

コード内のバグを修正してください。戻り値の型は文字列にすることはできません。IntPtrでなければなりません。次に、Marshal.PtrToStringAnsi()を使用して文字列を復元します。 –

+0

あなたの素早い返信のために@HansPassantに感謝します - それはそれをソートしました! – YetMoreStuff

答えて

1

vshost32.exeエラーが間違ったDLLIMPORT声明によって引き起こされる - 外部DLLの戻り値の型が文字列にすることはできません、それはのIntPtrでなければなりません。ここで

は修正されたコードです:

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

...これはDLLのメソッドに改訂された呼び出しです:答えのための@HansPassantへ

string version; 

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

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

感謝。

0

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

関連する問題