【问题标题】:How do I use DllImport with a C++ class?如何将 DllImport 与 C++ 类一起使用?
【发布时间】:2013-06-11 19:13:01
【问题描述】:

我正在尝试使用用 C++ 编写的 DLL。在 DLL 的示例中,有一个标头 (.h),其中包含以下代码:

#ifndef CODEGEN_H
#define CODEGEN_H

// Entry point for generating codes from PCM data.
#define VERSION 3.15

#include <memory>
#include <string>

#ifdef _MSC_VER
    #ifdef CODEGEN_EXPORTS
        #define CODEGEN_API __declspec(dllexport)
        #pragma message("Exporting codegen.dll")
    #else
        #define CODEGEN_API __declspec(dllimport)
        #pragma message("Importing codegen.dll")
    #endif
#else
    #define CODEGEN_API
#endif

class Fingerprint;
class CODEGEN_API Codegen
{
public:
    Codegen(const float* pcm, uint numSamples, int start_offset);

    string getCodeString(){return _CodeString;}
    int getNumCodes(){return _NumCodes;}
    float getVersion() { return VERSION; }
private:
    string _CodeString;
    int _NumCodes;
};

#endif

如何访问 dll 并使用他们的方法?我知道我将不得不使用[DllImports("codegen.dll")],但是我使用与示例相同的构造函数?

【问题讨论】:

标签: c# .net dllimport


【解决方案1】:

P/Invoke 旨在与 C API 一起使用,而不是与 C++ 类一起使用。

您需要将 C++ 类封装在 C API 中,然后将其导出。然后,您可以 P/Invoke(使用 [DllImport(...)])您的 C API 中的各个方法。

【讨论】:

  • 但是我该如何做这个导出呢?即使 dll 在 C++ 中也可以工作?
  • @RenanRigoCalesso 您拥有的 DLL 不能按原样与 P/Invoke 一起使用 - 您需要使用 C++/CLI 包装它,或者在其中创建一个 C API(或单独的 DLL ) 为 C# 公开它。
  • 我没有这个dll的代码。我可以在另一个 dll 中编译这个 dll 吗?
  • @RenanRigoCalesso 是的 - 您可以使用 C++/CLI 或创建 C API 创建一个包装该库的新库。
猜你喜欢
  • 2020-02-19
  • 1970-01-01
  • 2010-12-09
  • 2011-12-10
  • 2010-11-01
  • 1970-01-01
  • 2013-12-07
  • 2021-09-23
相关资源
最近更新 更多