First_Layer
私はVC++6サービスパック6で書かれたwin32dllを持っています。このdllをFirstLayerと呼びましょう。FirstLayerのソースコードにアクセスできませんが、マネージコードから呼び出す必要があります。問題は、FirstLayerが関数の引数としてstd::vectorとstd::stringを多用し、これらの型をC#アプリケーションに直接マーシャリングする方法がないことです。
Second_Layer
私が考えることができる解決策は、最初にVC++6サービスパック6で記述された別のwin32dllを作成することです。このdllを「SecondLayer」と呼びましょう。SecondLayerはFirstLayerのラッパーとして機能します。このレイヤーにはstd::vectorのラッパークラスが含まれているため、std::vectorはこのレイヤーのすべての関数パラメーターで公開されません。std::vectorのこのラッパークラスをStdVectorWrapperと呼びましょう。
このレイヤーは、メモリの割り当てまたは割り当て解除にnewまたはdelete操作を使用しません。これは、内部でstd::vectorによって処理されるためです。
Third_Layer
また、SecondLayerのラッパーとしてVC++2005クラスライブラリを作成しました。このラッパーは、アンマネージドSecondLayerをマネージドコードに変換するという汚い仕事をすべて行います。このレイヤーを「ThirdLayer」と呼びましょう。
SecondLayerと同様に、このレイヤーはStdVectorWrapperを処理するときにnewとdeleteを使用しません。
Four_Layer
さらに、ThirdLayerを呼び出すC#2005コンソールアプリケーションを作成しました。このC#コンソールアプリケーションを「FourthLayer」と呼びましょう。
呼び出しシーケンスの概要
FourLayer(C#2005)-> ThirdLayer(VC ++ 2005)-> SecondLayer(VC ++ 6)-> FirstLayer(VC ++ 6)
問題
「System.AccessViolationException:保護されたメモリの読み取りまたは書き込みを試みました」例外がスローされていることに気付きました。これは、SecondLayerの内部std :: vector割り当てメモリが原因で、ThirdLayerがアクセスするのは不正であると思われます。
これは、VC ++ 2005でFirstLayer(シミュレート)とSecondLayerを再コンパイルすると、問題が完全に解消されるためだと思います。ただし、ソースコードがないため、FirstLayerの製品版を再コンパイルすることはできません。
この問題を解決するには、StdVectorWrapperクラスにあるSecondLayerのstd::vector用の共有メモリアロケータをC++で作成する必要があると聞いています。共有メモリアロケータが必要な理由とその仕組みを完全に理解していませんか?何か案が?
コンパイルしてSecondLayerのコードと一緒に使用できる、インターネット上ですぐに利用できるソースコードはありますか?
これにはブーストライブラリを使用できないことに注意してください。