在C++应用程序中使用C#dll

Using a C# dll in a C++ application

本文关键字:C#dll C++ 应用程序      更新时间:2023-10-16

我必须替换旧项目中的DLL。该项目不能更改(向下兼容性、其他生产商等),并具有以下方法签名:

typedef UINT(*CALLBACK Initialise)();
Initialise fp_initialise;
typedef UINT(*CALLBACK ReadPosition)(int *ptr_ncolours, float *ptr_pderrs, float *ptr_cderrs);
ReadPosition fp_readposition;

等等。。。其中CALLBACK__stdcall

我的C#DLL接口:

[Guid("00005D2D-ABCD-3214-5694-A4EC0005B4D9")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    [ComVisible(true)]
    public interface IMainInterface
    {
        int Initialise();
        unsafe int ReadPosition(ref int ptr_ncolours, float* ptr_pderrs, float* ptr_cderrs);
//...
}

以及我使用接口的类:

    [ClassInterface(ClassInterfaceType.None)]
    [Guid("04991247-ABCD-ABCD-A4B8-3533D2F264D0")]
    [ComVisible(true)]
    [ProgId("MyDLL.Main")]
    public class Main : IMainInterface
    {
//...
}

在我的新C#dll中,Initialize(它没有参数)的调用是有效的,但任何其他方法调用都会在没有任何信息的情况下崩溃。

当我从C++应用程序调用它时,当我用新的C#dll替换旧的dll时,我必须如何在我的C#dll中编写这些方法?

您可以使用此处概述的反向p/Invoke技术,而不是通过COM公开您的功能。

这需要对调用代码稍作更改。如果您无法对原始项目二进制文件进行任何更改,可以创建一个与要替换的DLL同名的小型本机DLL,用作桥接器。

在这个桥接DLL中公开所有本机函数,并使用反向p/Invoke调用托管DLL(其名称当然需要更改为不同的名称)