【问题标题】:Re-using C++ functions by importing DLL in C#通过在 C# 中导入 DLL 来重用 C++ 函数
【发布时间】:2012-06-14 18:48:44
【问题描述】:

在将 C++ 创建的 DLL 导入 C# 时,我遇到了一些一般性问题。

1) 我编写了使用指针的 C++ 函数,例如双指针、指针数组等。 例如static int someFunc(char *var[]) 我如何重用它们,因为 C# 不支持指针。

2) 我是否需要在 C# 中通过 [DllImport()] 公开所有函数?即我有一个名为 someFunc 的函数,它在内部调用其他函数。我是否应该在“DllImport”下也公开这些功能

3) 谁能解释为什么我需要在 C# 中处理非托管代码,尤其是当我从 C++ 导入 dll 时?

【问题讨论】:

    标签: c# c++ dllimport


    【解决方案1】:

    第 1 点答案: 在 C# 的函数声明中使用 unsafe 关键字

    static unsafe int someFunc(char* var[]);
    

    第 2 点答案: 无需导入所有功能。只导入 someFunc()

    第 3 点答案: C# 使用类型安全的托管代码并引用一些有效的内存位置。然而,C++ 中的指针可能引用也可能不引用任何有效的内存位置。所以你需要在 C# 中处理非托管代码。

    【讨论】:

    • 您好,我正在使用一个名为 DWORD 的数据类型,我在 C++ 头文件中定义了它,该头文件包含在我的 C++ DLL 代码中。如何处理?因为 DWORD 在 C# 中不可见。
    • 请将 DWORD 替换为 System.Int32。如果 DWORD 未签名,则使用 System.UInt32。
    【解决方案2】:

    C# 确实支持不安全区域中的指针,但是,您也可以使用 IntPtr,它类似于 C++ 的 void* DllImport,将 IntPtr 作为参数或返回值。

    然而,正确的做法是使用marshaling 自动将 char* 转换为 System.String,反之亦然。 (和translate an array of char* to an array of strings。)

    【讨论】:

      猜你喜欢
      • 2016-05-23
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多