在 C# 中从 C++ DLL 访问指针参数值
Posted
技术标签:
【中文标题】在 C# 中从 C++ DLL 访问指针参数值【英文标题】:Accessing pointer parameter values from a C++ DLL in C# 【发布时间】:2015-12-15 21:10:32 【问题描述】:我有这个具有以下功能的 C++ dll:
extern "C" INT16 WINAPI SetWatchElements(INT16 *WatchElements)
INT16 Counter;
//some code
for (Counter = 0; Counter < WATCHSIZE; Counter++)
WatchElements[Counter] = MAPINT(WatchData[Counter]);
//some code
return ReturnValue;
本质上它只是为传入的指针/数组分配一些值。
当我尝试通过 C# 调用此函数时出现问题。这是 C# 中的函数定义:
[DLLImport("MyDll.dll")]
private static extern int SetWatchElements(ref Int16 watchElements);
以及我如何称呼它:
Int16 someData = 0;
var result = SetWatchElements(ref someData);
这编译得很好,我的变量someData
实际上有一个正确的值。问题是,由于在 C++ 世界中,这些值的设置超出了单个值的范围,所以我不确定如何在 C# 中访问它。
我尝试过这样做:
Int16[] someData = new Int16[80];
var result = SetWatchElements(ref someData[0]);
但结果是一样的。
PS:我不能在这里使用 unsafe ,因为它违反了我们的标准。
【问题讨论】:
SetWatchElements(ref someData[0]);
应该没问题,只要你没有跨越进程边界......你有证据证明它失败了吗?
我在控制台窗口中显示了所有值,并且 someData[0] 中有一个值,但所有其他索引都是 0
【参考方案1】:
尝试将导入的函数声明为:
[DLLImport("MyDll.dll")]
private static extern int SetWatchElements(Int16[] watchElements);
并在没有ref
的情况下调用它:
Int16[] someData = new Int16[80];
var result = SetWatchElements(someData);
【讨论】:
这行得通,但它没有。我有一个表单应用程序和一个控制台应用程序,它们都使用相同的 dll。这适用于控制台应用程序,但表单应用程序返回了 dll 的错误响应代码。我在表单文件中定义了 dll 函数定义。你知道是否有任何原因会导致不同的行为? @Josh 确保两个应用程序具有相同的目标平台(x86、x64)。 我做到了,它们都是 (x86)。表单应用程序被击中或错过。有时函数调用会通过,有时却不会。我尝试将这些方法放在后台线程中,但结果相同。 c++ dll是用来和串口通信的,所以不知道表单同步到串口是否有问题。以上是关于在 C# 中从 C++ DLL 访问指针参数值的主要内容,如果未能解决你的问题,请参考以下文章
c#调用c++的DLL,接口函数参数有函数指针,在线等解决办法