我的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是我的主要问题,我完全不知道如何使用或初始化
答案 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# - 或者你可以深入研究汇编。