C+中的System.ExecutionEngineeException+;CLI

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

我已通过Wrapper.cpp中的IntPtr将may本机指针转换为管理对象 下面是我的代码

    _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()来避免崩溃。