将 C++ DLL 导出到 C# Winform
exporting c++ dll to c# winform
我的 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# - 或者您可以深入研究程序集。
相关文章:
- 从多个文件访问静态全局 WinForm UI 对象
- 将 C 中的外部 DLL 追加到 C# 中的 WinForm 项目
- 在通过CPP项目开放时,为什么C#Winform与DPI 150%不同
- 在Winform中使用绘图
- HwndHost for Windows Form - Win32 / WinForm Interoperability
- 将 C++ DLL 导出到 C# Winform
- winform中的C++非托管代码
- 在C++中使用Winform作为视图
- 在Qt中从dll创建WinForm
- C++ Winform 如何将字符串数组解析为 int 数组
- 将文本输出到C++ Winform
- 用于开发winform应用程序的最佳UI框架或语言
- WINFORM C++ 托管字符串>非托管字符串与 fstream 结合使用时会产生意外结果
- c#text/winForm叠加视频游戏,如xfire、PIX、steam、fraps等
- 无法将winform控件大小传递给非托管代码
- 运行 WinForm 的函数"In Background" (VS2010 c++)
- 本机C++OpenGL到托管C++到Winform C#-调试过程中速度较慢