C#ライブラリ(VC++ 6.0)で書かれた外部プログラムからいくつかのメソッドを使用できるようにする必要があります。私はこのように、今までかなり正常に動作する混合アセンブリを作成しましたが、.NETオブジェクトの配列を返すメソッドにはいくつかの問題があります。オブジェクトのC#配列をC++/CLIに渡す
方法の.NETシグネチャは次のとおりです。
Results
自体はある
public Results[] Measure(String model, String identifier);
:
public class Results
{
public String[] ElementType;
public bool[] HasError;
}
C++からのエントリポイントを提供するために、私はC++/CLIを書き始めましたこのようなラッパーメソッド:
std::vector<ResultsWrapper> Measure(char* model, char* identifier)
{
// Call .NET code
String^ gcmodel = gcnew System::String(model);
String^ gcidentifier = gcnew System::String(identifier);
cli::array<Results^>^ gcres = myNetInstance->Measure(gcmodel, gcidentifier);
// Convert results to C++ vector
std::vector<ResultsWrapper> ret;
for (int ki = 0; ki < res->Length; ki++)
{
ResultsWrapper r = ResultsWrapper(res[ki]->....,);
ret.push_back(r);
}
return ret;
}
しかし、私は少し失われていることを認めなければならない、これはC++の単一行を書いていない、非常に長い時間です。私はと手をつないでいません。メモリ管理...
ResultsWrapper
クラスを作成する最良の解決策は何ですか。そのため、C++側からのメモリ管理を気にする必要はほとんどありません。次のようなものでしょうか?
class ResultsWrapper
{
public:
ResultsWrapper(vector<std::String> elementType, vector<bool> hasError)
{
this.ElementType = elementType;
this.HasError = hasError;
}
public:
vector<std:String> ElementType;
vector<bool> HasError;
}
NB:私はVC++ 6.0側のチームは、ブーストライブラリまたはshare_ptrの種類を認識しているとは思わない(と私はどちらかそれらについて非常に知識豊富ではありませんよ)。すべてのC++コードは非常に古典的なC++コードスタイルであり、stdlib
を使用していません。 C++/CLIで
私は配列を最初に直列化し、次にdeserializeする必要があると思います – pedrofernandes
@ pho3nixあなたは正しいです。少なくとも、あなたがC++/CLIの賞金をすべて無視して、その言語が提供するものを知らないのであれば。それ以外の場合、あなたは完全に不必要なことをしています。素晴らしいプログラミング。 – TomTom
std :: vectorは使用できません。コンパイラは古すぎます。同様の理由でメモリ管理も問題であるため、* new *で配列を割り当てることもできません。 LocalAlloc()またはSafeArrayCreate()を使用してどこかに移動します。 –