【问题标题】:how to include a C DLL in a C# application when there are pointers involved?当涉及指针时,如何在 C# 应用程序中包含 C DLL?
【发布时间】:2012-10-30 13:45:44
【问题描述】:

我一直试图在我的 C# 应用程序中包含一个 C DLL,用于 windows mobile 6.5,但我无法获得正确的行为。

我一直尝试使用的函数如下(如头文件中所述):

extern "C" __declspec (dllimport) BOOL Init (wchar_t *data);

其中数据是输入/输出参数。

我的代码,包括这个功能,是这样的:

[DllImport(@"ICCardReader.dll")]
public static extern int Init([MarshalAs(UnmanagedType.LPWStr)] ref string data);

尽管在运行时调用此函数时编译器会接受这一点,但该函数的行为不佳(结果始终为假)。

所以除了明显的“我做错什么了吗?”之外,我的问题是:当涉及到指针时,如何在 C# 应用程序中包含 C DLL?

P.S.我已经能够通过第三方应用程序验证 DLL 的正确性

[编辑]

感谢用户的建议,我已将 Dllimport 更改如下:

public static extern int Init(StringBuilder data);

【问题讨论】:

  • swig (swig.org/compare.html) 的工作?
  • 我不知道有这样的东西,它非常吸引人,我一定会研究它。
  • C# 有指针,我会使用它们。
  • 如果传递给函数的数据指针在函数中发生了变化,可以考虑使用StringBuilder而不是ref string。
  • @sardok 是的,字符串被函数修改了,所以我将输入参数更改为 StringBuilder 但仍然没有变化。

标签: c# .net c pointers dll


【解决方案1】:

您可能想检查 BOOL 的定义。我怀疑这可能是由于 C 中缺少内置 bool 而导致的其他类型定义。

可能值得尝试将您的 DllImport 更改为

[DllImport(@"ICCardReader.dll")]
public static extern int Init(StringBuilder data);

并检查是否有一些整数值返回。

[编辑] 也尝试将输入更改为 StringBuilder

【讨论】:

  • 感谢贾斯汀的帮助。是的,它被定义为整数值,但此更改并未解决问题。
  • @user1497231 - 更新您的代码以反映更改。 C# 中的 boolint 之间存在区别。
  • @user1497231,那么,您是说您将 C# 定义更改为返回 int 并且现在返回 0?
  • @JustinHarvey 是的,就是这样。
  • @user1497231,查看编辑,尝试将输入参数作为 StringBuilder 类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
相关资源
最近更新 更多