我的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
}
我收到此错误:
尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
一直在搜索google并盯着这个代码几个小时,每当我设法解决问题时,每当我致电
setvaluesDLL(//parameters)
时,都会出现一个新代码编辑:
IntPtr ptr是我这里的主要问题,我完全不知道如何使用或初始化它
最佳答案
您必须使用CreateS()结果初始化第一个setvaluesDLL参数值。此方法也应从dll导入。与DestroyS相同-正确释放内存
关于c# - 将C++ DLL导出到C#Winform,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20683295/