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

时间:2014-08-29 07:23:24

标签: c# c++ .net dll

我必须替换旧项目中的DLL。此项目无法更改(向下兼容性,其他生产者等),并具有以下Methodsignature:

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中编写这些方法?

1 个答案:

答案 0 :(得分:2)

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

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

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