从第 3 方库导出 cpp 损坏的函数

Exporting cpp mangled functions from a 3rd party library

我有第三方库作为源代码。它带有一个 Visual Studio 项目,可以从中构建一个 .lib。

虽然我想从 C# 访问功能,所以我复制了项目并将其更改为创建一个 dll。

虽然 DLL 不包含任何导出函数,因此我还创建了一个模块定义 (.def) 文件,并在导出部分添加了我需要的函数。

这适用于在 extern "C" 块中声明的所有函数。但是,我需要的一些功能是在这些块之外声明的。

如果我将这些添加到出口部分,我会收到错误 LNK2001 unresolved external symbol XYZ :(

如果可以避免,我不想更改 3rd 方库的源代码。

访问这些功能的最优雅、最简单的方法是什么?

编辑

还有一点需要澄清:据我所知,我想公开的接口中没有涉及 C++ 功能。老实说,我不明白为什么第 3 方作者不只是将剩余的几个函数包含到 extern "C" 块中。这些函数在头文件的底部,也许添加它们的人犯了一个错误,将它们放在 extern "C" 块范围之外。

对于 C++,一种方式(恕我直言,最优雅)是使用专为此设计的 C++/CLI。特别是如果你不仅有功能,还有 classes.

您创建了一个相当简单的薄包装层:

  1. 创建 CLI class
  2. 放一个原来的成员实例class
  3. 包装原始 class
  4. 中的所有 public 方法

像这样(未经测试):

C++ nativ:

// original c++ class
class Foo {
public:
    Foo(int v) : m_value(v) {}
    ~Foo() {}

    int  value()      { return m_value; }
    void value(int v) { m_value = v; }

private:
    int m_value;
};

CLI 包装器:

// C++/CLI wrapper
ref class FooWrap
{
public:
    FooWrap(int v) { m_instance = new Foo(v); }
    !FooWrap()     { delete m_instance; }
    ~FooWrap()     { this->!FooWrap(); }

    property int value {
        int  get()      { return m_instance->value(); }
        void set(int v) { m_instance->value(v); }
    }

private:
    Foo *m_instance;
};

Here 你可以找到一个简短的 howto,里面有更详细的描述。

编辑:

来自您的评论:

[...] I never worked with C++/CLI though and the language looks a little confusing. Since the project deadline is pretty close I'm not sure if there's enough time to learn it. I'll definitely keep this option in mind though!

如果你不是寻找最优雅的方式,就像你原来的问题一样,而是fastest/shortest方式:对于C++一种方式(恕我直言,最短方式)将使用为此设计的 C++/CLI。特别是如果你不仅有功能,还有 classes。您创建了一个相当简单的薄包装层... Here 您可以找到一个简短的(10 分钟内)howto,其中对其进行了更详细的描述。