将 C++ DLL 导出到 C# Winform

exporting c++ dll to c# winform

本文关键字:Winform C++ DLL      更新时间:2023-10-16

我的 c++ 头文件中有这些

#ifndef S2dll_H
#define S2dll_H
#ifdef S2dll_EXPORTS
#define S2dll_API __declspec(dllexport)
#else
    #pragma message("automatic link to S2dll.LIB")
    #pragma comment(lib, "S2dll.lib")
#define S2dll_API __declspec(dllimport)
#endif

类是这样声明的

class S2dll_API Sample
{
//members here
}

包含函数定义、构造函数的 cpp 文件

void * __stdcall CreateS() //constructor
{
    return new SDLL;
}

void __stdcall DestroyS(void * objPtr) //destructor
{
   s* sObj = (s *) objPtr;
    if (sobj)
        delete sObj;
}

导出/公开此函数

void __stdcall setvaluesDLL(void *ptr, int x, int y,int s, int p)
    {

        Sample *dll =  (Sample *) ptr;
        if (dll)
        {
            dll->setposition(c); //functions in the cpp file
            dll->setlocation(x,y);
            dll->setsize(s);
        }
    }

一个 .def 文件

LIBRARY BS2dll
EXPORTS
CreateS
DestroyS
setvaluesDLL

所以我正在尝试在我的 c# win 表单中访问它

做了这个来暴露它

static internal  class dllcall
{
[DllImport(@"adrressS2dll.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern void setvaluesDLL(IntPtr ptr,int x, int y, int s, int p);
}

在我的通知中调用它

private void Assign_Click(object sender, EventArgs e)
{
dllcall.setvaluesDLL(ptr, x, y, s, p);//all values are int
 }

我收到此错误:已尝试读取或写入受保护的内存。这通常表示其他内存已损坏。

一直在谷歌搜索并盯着这个代码几个小时,每次我设法解决问题时,每当我打电话给setvaluesDLL(//parameters)时,都会出现一个新的

问题

编辑:IntPtr ptr 是我在这里的主要问题,我完全不知道如何使用或初始化它

您必须使用 CreateS() 结果初始化第一个 setvaluesDLL 参数值。此方法也应从 dll 导入。与 DestroyS 相同 - 正确释放内存

您的 C++ 文件中有 5 个参数:

void __stdcall setvaluesDLL(void *ptr, int x, int y,int s, int p)

在 C# 中只有 4 个:

public static extern void setvaluesDLL(int x, int y, int s, int p)

此外,我认为没有直接等同于 void* 指针,因此您可能希望使用不安全的代码(您需要在项目设置中允许它)。

我所知,您无法在 C# 中显式导入 c++ 类(以在 Assign_Click 中初始化 ptr)。也许您可以在 dll 中编写一些函数以使其可用于 C# - 或者您可以深入研究程序集。