将对象的C#数组传递给C++/CLI



我被迫在C#库中公开一些方法,以便可以从用C++(VC++6.0)编写的外部程序中使用它们。因此,我创建了一个混合程序集,到目前为止工作得很好,但我在返回.NET对象数组的方法方面遇到了一些问题。

该方法的.NET签名为:

public Results[] Measure(String model, String identifier);

其中Results本身是:

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; 
}

注意:我不认为VC++6.0方面的团队知道boost库或share_ptr类型(我也不太了解它们)。所有C++代码都是非常经典的C++代码风格,甚至不使用stdlib

我无法安全/轻松地跨dll边界传递STL类型,所以我回到了旧的char**,手动分配/释放和It Just Worked。。。

IJW只有一段时间。。。然后我试着检查从.NET向调用C++的应用程序抛出异常时,以及patatra。。。需要转换为本机异常。。。再次无法安全地跨越dll边界。。。

从.NET到本机的混合模式程序集听起来很有吸引力,但在我的情况下,这是一种IJS体验。。。我放弃了,改为通过COM。

在C++/CLI中,我开始编写这样的包装方法:

不,你没有

publicResults[]Measure(字符串模型,字符串标识符);

在中没有相似之处

std::vector Measure(char*模型,char*标识符)

无。

C++/CLI引用类中不需要进行封送。使用String^作为指向字符串的指针(而不是char*),并使用array<ResultsWrapper>^作为指向托管数组的指针。

根本不需要使用包装器。将类声明为托管引用(ref类),您可以从.NET端调用它,因为它是.NET类。

最新更新