从C#

时间:2019-02-01 09:03:58

标签: c# c++ dll

我正在尝试从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,但我想知道是否有任何直接且快速的解决方案。

1 个答案:

答案 0 :(得分:0)

我按照@PaulMcKenzie的建议创建了一个实例,并且工作正常。 我错误地认为我可以抓住DLL并使用所需的计算功能,但我想我做不到。 只是将这个答案留给可能犯同样错误的其他人。

相关问题