C# 包装类和来自 c++ 的 dllimport

Posted

技术标签:

【中文标题】C# 包装类和来自 c++ 的 dllimport【英文标题】:C# wrapper class and dllimport from c++ 【发布时间】:2014-02-13 12:14:12 【问题描述】:

这个想法是制作 C# 包装类。我知道结构,但我不知道如何以相同的方式使用指针或以类似的方式使用指针,因为我的 C# 技能没有出现。 (从 C++ 读取到 C# 的翻译)。如果我是对的,C# 中的内存使用情况就大不相同了。

结构是这样的。

public class Unknown

    [DllImport("UnknownSDK.dll")]
    //functions to be translated

要翻译的功能:

bool setA(int id, int i);
bool set1(int max, level *many);
bool getA(frame * const * const fame);
void give(frame * const * const fame);

提前致谢。

这是level的结构:

  typedef struct level 

    int A;
    int B;
    int fade;
 level;

框架结构:

  typedef struct frame 

    DWORD header;
    DWORD padding;
    BYTE bpadding[2];
    int asd;
    group_t group[1];
 frame;

我希望这能澄清一点。我要说的主要问题是 C# 中的这些指针和 * const * const 结构。稍后我还会告诉你我的研究教会了我什么,但它仍在学习,所以我没有任何测试代码可以展示给你,因为我还没有了解它的全貌。

【问题讨论】:

好吧,基本上我还没有尝试过任何事情,因为我遇到了这个问题,即使在我的脑海中我也无法将这些函数转换为 C#。我有一个巨大的 C++ 项目,我想把它放在 .NET 环境中,据我所知,这是使用包装类并继续的最简单方法。 @mattimarvi 您阅读了哪些关于 P/Invoke 的信息,我们可以帮助您澄清一下?如果您展示自己为解决问题所做的努力,您将获得更多更好的答案 - 最好提供您尝试过但不起作用的代码。 另一种方法是编写 C++/CLI 包装器。您需要学习 C++/CLI 语法,但您无需担心DllImport 等。 这会很棘手,因为frame 使用 C struct hack 是可变长度的,因此 p/invoke 无法编组它。 【参考方案1】:

这是导入方法的方式:

[DllImport("UnKnowSDK.dll")]
private static extern bool setA(int id, int i);

您可以像这样简单地调用方法:

bool res = setA(1,2);

要将结构作为参数传递,必须知道其确切结构并在 c# 中复制它。要操作您可以使用的数据:

    Frame fr = new FrameStruct();
fr= (ExchangeStruct)Marshal.PtrToStructure(frame, typeof(FrameStruct));

【讨论】:

以上是关于C# 包装类和来自 c++ 的 dllimport的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的非托管 C++ 类

FMOD C# Wrapper 无法找到 fmod.dll(来自 Monogame 3.8)

C# 和 C++ dll - 编组字符串

如何使用 DLLImport 将字符串从 C# 传递到 C++(以及从 C++ 到 C#)?

Dllimport 将字符串从 C# 传递到 C++

在同一解决方案中从 c# 项目到 c++ 项目的 DllImport