试图在 c# 访问 c++ dll 时读取或写入受保护的内存错误
本文关键字:受保护 错误 内存 读取 访问 dll c++ | 更新日期: 2023-09-27 18:36:22
下面是 C++ DLL 类
class A
{
public:
int __thiscall check(char *x,char *y,char *z);
private:
B *temp;
};
class B
{
friend class A;
Public:
B();
B(string x,string y,string z);
~B();
private:
string x;
string y;
string z;
};
C++ DLL 方法定义如下
__declspec(dllexport) int __thiscall A::check(char *x,char *y,char *z)
{
temp=new B(x,y,z); //getting error at this point when i am assigning memory to temp
return 1;
}
C# DLL 导入是这样的
[DllImport("MyDll.dll", CallingConvention = CallingConvention.ThisCall, ExactSpelling = true, EntryPoint = "check")]
public static extern int check(IntPtr val,string x,string y,string z);
C ++ DLL 构建工作正常,但是当 C# 调用 C++ DLL 方法时,它看起来也不错,当它进入函数并在方法的第一行中,它尝试为临时指针创建内存,该指针已在类 A 中声明为类 B 的指针,这是私有的。 它给出的错误是
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
__declspec(dllexport)
应该在类上(例如.class __declspec(dllexport) MyClass
),而不是在其成员方法上。
入口点应为损坏的C++名称(例如 2@MyClass@MyMethod?zii
),而不是"check
"。
可以使用 Depends.exe 来查找名称。
我发现了问题,问题出在 c++ 中的检查函数上。临时应该像这样创建。
int __thiscall A::check(char *x,char *y,char *z)
{
A *xyz=new A();
A->temp=new B(x,y,z); // doing this eliminates the issue.
return 1;
}
感谢所有帮助过我的人。