【问题标题】:Access Violation when returning a value calling a C++ dll function from C#返回从 C# 调用 C++ dll 函数的值时访问冲突
【发布时间】: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 导出的“免费”函数,我可以理解,但事实并非如此。我同意这个问题是不完整的。

标签: c# c++ dll


【解决方案1】:

我按照@PaulMcKenzie 的建议创建了一个实例,它运行良好。 我错误地认为我可以抓住 DLL 并使用所需的计算函数,但我想我不能。 把这个答案留给可能犯同样错误的其他人。

【讨论】:

    猜你喜欢
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    相关资源
    最近更新 更多