【发布时间】:2019-02-01 09:03:58
【问题描述】:
我正在尝试从 C# 调用 DLL 中的 c++ 函数。这个函数的一个参数是一个指向短类型变量的指针。
我没有做任何花哨的数据结构或未知大小的变量。只是一个简单的短值。
当 DLL c++ 函数尝试修改此变量的值时,它会给出“非托管异常 0xC0000005:访问冲突”。
我无法修改 DLL 源(它在其他项目中使用,我无法触摸它,尽管我有源代码可以调试它)
c++ DLL函数代码(请注意代码中“//此行引发异常”注释行)
// declaration
virtual TestFunction(short __RPC_FAR *sRet) = 0;
// definition
STDMETHODIMP CABTest::TestFunction(short *sReturnValue)
{
//some
//calculations
//here
*sReturnValue = 1; //this line provoques the exception
return 0;
}
调用 DLL 的 C# 代码
[DllImport("test.dll", SetLastError = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern short TestFunction(ref short sReturn);
short sMyValue = 0;
TestFunction(ref sMyValue);
我希望 sMyValue 的值为 1,因为我传递的引用是一个直接的短类型(不是花哨的数据结构),但我只会遇到应用程序崩溃(上述异常)。
我可以在 C# 代码中做些什么来避免这个问题?我所看到的所有搜索类似问题都需要重写 C++ 函数(将“short *sReturnValue”更改为“short **sReturnValue”,但我无法触及原始 DLL 源代码。
我想我会编写一个调用 test.dll 的 wrapper.dll,但我想知道是否有任何直接且更快的解决方案。
【问题讨论】:
-
您确定
CABTest::TestFunction(short*)是静态成员函数吗?我们看到函数的声明了吗? (.h) -
@RobertAndrzejuk 当然不是。
-
*sReturnValue的值是多少?不是写共享内存的问题吗? -
@PtolomeoXII 您发布的 C++ 代码没有添加到 IMO。你有一个虚函数,它需要一个
CABTest的实例,但没有提到在你的C# 代码中创建一个CABTest实例以供C++ DLL 使用。如果TestFunction是一个简单的C导出的“免费”函数,我可以理解,但事实并非如此。我同意这个问题是不完整的。