我必须替换旧项目中的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中编写这些方法?
答案 0 :(得分:2)
您可以使用概述here的反向P / Invoke技术,而不是通过COM公开您的功能。
这需要对调用代码稍作更改。如果您无法对原始项目二进制文件进行任何更改,则可以创建一个与要替换的DLL同名的小型本机DLL,以充当桥接器。
在此桥接DLL中公开所有本机函数,并使用反向P / Invoke调用托管DLL(其名称当然需要更改为不同的名称。)