C# コードで使用するための C++ ライブラリがあります。Win32 用にビルドしたときは問題ないように見えましたが、x64 用にビルドすると、奇妙なことが起こり始めました。プラットフォームに関連していない可能性がありますが、なぜそれが起こっているのか、他にはわかりません。
これは私のコードの単純化されたコピーであり、x64 のコンソール アプリケーションでは完全に動作しますが、私のライブラリでは動作しません。私のライブラリの特徴: 静的にリンクされた cryptopp ライブラリを使用し、x64 用に自分でビルドし、ランタイム ライブラリ = MDd を使用しました (ただし、MTd を使用することをお勧めしましたが、試してみても効果はありませんでした)。また、私の cpp ライブラリはメソッドをエクスポートします。ランタイム ライブラリと cryptopp をリンクするためのパスを除いて、プロジェクトのプロパティを変更したことを思い出せません。
このコードは、同じソリューション内のテスト プロジェクトから呼び出され、同じ効果を持つ C# コードからも呼び出されます。また、テスト メソッドが実行される前のテスト プロジェクトの開始時に、KernelBase.dll に多くの例外があります。
// library
class SymmetricAlgorithm
{
public:
SymmetricAlgorithm() {}
vector<byte> Key;
vector<byte> IV;
};
class Data
{
public:
Data(vector<byte> b) {_b = b;}
vector<byte> GetBytes() {return _b;}
private:
vector<byte> _b;
};
// test project
vector<byte> b(10, 1);
Data key = Data(b);
SymmetricAlgorithm sa;
sa.Key = key.GetBytes();
vector._Tidy() (最後の行の vector への代入 vector の瞬間に呼び出される) メソッドで取得した例外メッセージは、次のように述べています。
>vstest.executionengine.exe の 0x000007fefdaa940d (KernelBase.dll) での初回例外: Microsoft C++ 例外: >Microsoft::VisualStudio::CppUnitTestFramework::CSEException メモリ位置 0x1d26baf0 で。
この例外のハンドラがあれば、プログラムは安全に続行できます。