将c ++ dll导出到c#winform

时间:2013-12-19 13:42:07

标签: c# c++ winforms dllimport dllexport

我的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(@"adrress\S2dll.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern void setvaluesDLL(IntPtr ptr,int x, int y, int s, int p);
}

在我的winform中调用它

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

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

一直在搜索谷歌并盯着这段代码几个小时,每当我设法解决问题时,每当我打电话setvaluesDLL(//parameters)

时都会出现一个新的问题

EDITED: IntPtr ptr是我的主要问题,我完全不知道如何使用或初始化

3 个答案:

答案 0 :(得分:1)

您的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 *指针,因此您可能希望使用不安全的代码(您需要在项目设置中允许它)。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

据我所知,你无法在C#中显式导入c ++类(在Assign_Click中初始化ptr)。也许你可以在dll中编写一些函数来将它呈现给C# - 或者你可以深入研究汇编。