C+中的System.ExecutionEngineeException+;CLI
我已通过Wrapper.cpp中的IntPtr将may本机指针转换为管理对象 下面是我的代码C+中的System.ExecutionEngineeException+;CLI,c,c++-cli,native,C,C++ Cli,Native,我已通过Wrapper.cpp中的IntPtr将may本机指针转换为管理对象 下面是我的代码 _declspec(dllexport)int UnmanagedAlgebraComputation::SubtractMultiplyWrapper(UnmanagedSubtraction *unmanagedSubtraction) { AlgebraCSharp::AlgebraComputation^ obj= AlgebraCSharp::AlgebraC
_declspec(dllexport)int UnmanagedAlgebraComputation::SubtractMultiplyWrapper(UnmanagedSubtraction *unmanagedSubtraction)
{
AlgebraCSharp::AlgebraComputation^ obj= AlgebraCSharp::AlgebraComputation::GetObject;
unmanagedSubtraction=new UnmanagedSubtraction();
System::IntPtr ip=System::IntPtr(unmanagedSubtraction);
Object^ handle=Marshal::GetObjectForIUnknown(ip) ;
return obj->Subtraction((AlgebraCSharp::SubtractComputation^)handle);
}
但是在Object^handle=Marshal::GetObjectForIUnknown(ip)行上;它将异常作为“System.ExecutionEngineeException”抛出。
请告诉我与此相关的解决方案。主要原因是封送工具不知道如何封送您的类型。因此,您可以通过将结构前缀为
[StructLayout(LayoutKind.Sequential, Pack = 1)]
或
为嵌套数组加前缀,如
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
你可以查看这个链接,这是不应该发生的,就像CLR bug一样。但是,如果使用新操作符创建非托管对象,“ip”实际上是有效的IUnknown COM接口指针的几率非常接近于零。COM对象必须使用CoCreateInstance()创建。所以不要使用GetObjectForIUnknown()来避免崩溃。