2016-04-18 7 views
2

この疑問の派生物は確かに尋ねられましたが、私のケースに一致するものはまだ見つかりません。プロテクトされたメモリの例外は、デバッグなしで発生しますが、デバッグなしで発生します。

私はサードパーティのC++ライブラリをラップし、それをいくつかの社内システムに提供するライブラリを作成しました。作成されたライブラリはC++/CLIを使用して、ユーザーがC#経由でアクセスできるようにします。ライブラリは構築され、内部連続的な統合NuGetサーバを使用して起動することができるため、使用可能です。

「デバッグを開始」(F5)でプログラムを実行しているときにこのライブラリを使用しても問題はありませんが、「デバッグなしで起動」(Ctrl + F5)または実行可能ファイル以下の例外が発生します

Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 

at TheirLib.func(Int32 , Int32 , Double* , Int32 , Int32* , Int32* , Double* , Int32 , TheirLibError*) 
at MyLib.Func(Int32 n, Int32 m, Double[] x, Int32 tdx, Int32[] svar, Int32[] sobs, Double[] corr, Int32 tdc) 
at SomeApplication.Program.Main(String[] args) in d:\SomeApplication\SomeApplication\Program.cs:line 67 

私はそれが1は、.NET 4.5.2が必要ですが、これは何も変更していないことが考えられていること、ここで(https://connect.microsoft.com/VisualStudio/feedback/details/819552/visual-studio-debugger-throws-accessviolationexception)をお読みください。私はまた、私のC++/CLIライブラリにこの問題を回避するための設定があるかもしれないと思っていましたが、何かを見つけることができず、どこでも見たような気がします。私はまた、サードパーティのライブラリを呼び出すときに使用されるpin_ptrオブジェクトを準備するC++/CLIコードを見ましたが、すべてがうまく見えます(下記参照)。再び

void MyLib::Func(int n, int m, array<double>^ x, int tdx, array<int>^ svar, array<int>^ sobs, 
    array<double>^ corr, int tdc) 
{ 
    // Setup input parameters 
    pin_ptr<double> xPtr = &(x[0]); 
    pin_ptr<int> svarPtr = &(svar[0]); 
    pin_ptr<int> sobsPtr = &(sobs[0]); 
    pin_ptr<double> corrPtr = &(corr[0]); 
    TheirLibError fail; 

    // Call their library's function 
    func(n, m, xPtr, tdx, svarPtr, sobsPtr, corrPtr, tdc, &fail); 
} 

、ライブラリは「デバッグ開始」で期待どおりに動作し、テストの網羅セットを渡しますが、これはスタンドアロンで動作しない理由を私は理解できない...私は、文字通り、この時に何かをしようとしますそれが機能するように指してください。あなたが私の唯一の希望です...

+3

なぜdownvotes?質問/問題に関して何かが明確でないか、どこかに解決策がある場合、私はそれらのことについてだけ聞きたいと思います... – grantathon

+0

私はあなたが多くの助けを得ることはないでしょう、エラーサードパーティのlibにあるようです...配列が十分に大きいことを再確認しましたか?私はパラメータの1つがアイテム数であると考えます、あなたはその価値をチェックしましたか?/ –

+0

@ルーカス:MyLib :: Funcを見ると、pin_ptrオブジェクトが適切に初期化されていると思いますか?あなたは普通に見られるものと矛盾する何かを見ますか? – grantathon

答えて

1

TheirLibErrorは正しく初期化されておらず、この構造体に含まれるポインタがライブラリ内で正しく処理されていないという問題がありました。それを適切に初期化した後、すべてが期待通りに機能しました。

ストーリーのモラルは、図書館の所有者が、図書館がポインタを保持しているかどうか、またはAccessViolationExceptionで接近したときに他のポインタの振る舞いについて調べることです。

関連する問題