关于在托管C++程序中通过反射调用C#的Dll的问题
关于在托管C++程序中通过反射调用C#的Dll的问题,请大侠帮看看,详细如下:
有一个C#的DLL(A.dll)中有如下一个函数:
public bool Test(int count, Detail[] Details)
其中Detail是一个自定义类型,定义如下:
public class Detail
{
public string MsgCode { get; set; }
public string[] MsgParams { get; set; }
}
我现在想要在C++程序中使用上面这个接口函数,这个C++程序是托管程序。
下面是我的代码(简化版),可是运行时有问题,详细见下:
//创建C#类实例
Assembly^ assem = Assembly::LoadFrom(gcnew String("A.dll"));
Type^ type = assem->GetType("libA.XXX");
Object^ obj = Activator::CreateInstance(type);
// 创建自定义类型数组
Type^ type_Details = assem->GetType("libA.Detail");
array<Object^>^ Details = gcnew array<Object^>(5);
for( int i = 0; i < 5; ++i )
{
Details[i] = Activator::CreateInstance(type_Details);
}
MethodInfo^ method = type->GetMethod("Test");
Object^ obj_result;
array<Object^>^args;
args = gcnew array<Object^>(4);
args[ 0 ] = 1;
args[ 1 ] = Details;//这个是输出参数
obj_result = method->Invoke(obj, args); // 错误信息:不能转换类型'System.Object[]'到'libA.Detail[]'
现在的问题是调用的C#函数的参数是自定义类型的数组时就不好使,
如果不是数组,或者是内置类型数组都没有问题。