在 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,接口函数参数有函数指针,在线等解决办法

在 C# 中从 C++ .DLL 加载值始终返回 true

C#如何调用C++的DLL的结构体数组指针

C# 调用C++ DLL,而c++函数的有一个参数需要是null,该怎么传递?

C#怎么调用C++的dll?

C++ DLL 返回从 Python 调用的指针