亲测 c++生成dll,c++和c#调用dll

时间:2024-04-03 16:42:07

动态dll还是需要vs不是vscode

C++生成动态链接库 教程 教训,这个h和dll文件放置位置是在代码这个文件夹,不是debug文件夹。。。
https://blog.csdn.net/shuimanting520/article/details/78715615

VS查看dll声明的函数

https://blog.csdn.net/weixin_34234823/article/details/86258541
VS的Developer Command Prompt命令窗口
dumpbin /exports D:\workplaceXuzhou\exploreCjiajia\Cjiajia\panny_dll_test\panny_dll_test\panny_dll.dll
亲测 c++生成dll,c++和c#调用dll
的确有
[email protected]@YAHHH@Z = @ILT+545([email protected]@YAHHH@Z)

c#调用c++的dll

下面这个问题是c#不能直接调用c++的dll

it is a valid assembly or com component
无法找到入口

最终调用 CallingConvention = CallingConvention.Cdecl这个不能漏掉。。
[DllImport(“panny_dll.dll”, EntryPoint = “[email protected]@YAHHH@Z”, CallingConvention = CallingConvention.Cdecl)]
public static extern int add(int a, int b);

对 PInvoke 函数“WpfApplication1!WpfApplication1.MainWindow::add”的调用导致堆栈不对称。原因可能

解决方案:CallingConvention = CallingConvention.Cdecl这个不能漏掉

一般在dll里面函数 用dllexport 类型对应就行,比如 int 对应Int32 char*对于String
BSTR ——— StringBuilder
LPCTSTR ——— StringBuilder
LPCWSTR ——— IntPtr
handle———IntPtr
hwnd———–IntPtr
char *———-string
int * ———–ref int
int &———–ref int
void *———-IntPtr

C#调用的dll默认是debug文件夹

函数名称发生变化的原因是没有 模块头文件

序号就是第几个函数的意思
LIBRARY “USER_COM”
EXPORTS
OpenCOM @ 1
COM_Send @ 2
COM_RX @ 3
Close_COM @ 4

extern “C” USER_COM_API bool OpenCOM();
extern “C” USER_COM_API int COM_Send(unsigned char cmd, unsigned char data1, unsigned char data2);
extern “C” USER_COM_API int COM_RX(uint8_t* Rx_buff);
extern “C” USER_COM_API void Close_COM();

测试
dumpbin /exports D:\workplaceXuzhou\exploreCjiajia\Cjiajia\panny_dlldef\Debug\panny_dll.dll
结果

亲测 c++生成dll,c++和c#调用dll