在C++应用程序中使用C#dll
Using a C# dll in a C++ application
我必须替换旧项目中的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(其名称当然需要更改为不同的名称)
相关文章:
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- C++:将外部库链接到dll库
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 不同的Visual Studio版本中缺少.dll
- 从DLL中删除类的实例
- 如何包装第三方DLL在R中使用
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Python ctypes:不会按预期加载 dll
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL