原生dll的.net包装器 - 如何最大限度地降低运行时错误的风险?

use*_*059 5 .net c# c++ dll wrapper

我正在开发一个C#应用程序.由于我有一些适用于C/C++的最小二乘拟合算法太过繁琐,我已经将C++代码变成了一个dll,然后在C#中创建了一个包装器.

在C#代码中,我定义了一个结构,该结构作为指针传递给非托管C++代码.该结构包含拟合函数的初始猜测值,它还用于返回拟合的结果.

在我看来,您必须在托管代码和非托管代码中定义结构.但是,将来使用我的源代码的人可能决定更改C#应用程序中结构的字段,而不了解他们还必须更改本机代码中的结构.这最多会导致运行时错误(并且会导致错误的结果),但是没有错误消息告诉开发人员/最终用户有什么问题.

根据我的理解,不可能在非托管C++ DLL中创建一个测试,检查结构是否包含正确的字段,但是可以让DLL将正确格式的结构返回给C#包装器吗?

否则,有哪些方法可以降低未来一些粗心的程序员导致难以检测的运行时错误的风险?

示例代码:

//C++
struct InputOutputStruct {
    double a,b,c;
}

extern "C" __declspec(dllexport) void DoSomethingToStruct(InputOutputStruct* s)
{
Run Code Online (Sandbox Code Playgroud)

// ...算法

}

//C#
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
    public struct InputOutputStruct {
        public double a,b,c;
    }

[DllImport("CpluplusDll.dll")]
    public static unsafe extern bool DoSomethingToStruct(InputOutputStruct* s);

class CSharpWrapper {
    static void Main(string[] args)
    {
        InputOutputStruct s = new InputOutputStruct();
        unsafe {
            InputOutpustruct* sPtr = &s;
            DoSomethingToStruct(sPtr);
            s = *sPtr;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Pup*_*ppy 4

在我看来,您必须在托管和非托管代码中定义该结构。

不对。这就是 C++/CLI 的发明目的——促进与 C++ 和 .NET 的更轻松的互操作。