我有一个第三方库作为源代码。它带有一个Visual Studio项目,可从中构建一个.lib。
虽然我想从C#访问功能,所以我复制了项目并更改了它以创建dll。
尽管DLL不包含任何导出的函数,所以我还创建了一个模块定义(.def)文件,并在EXPORTS部分中添加了我需要的函数。
这适用于extern "C"
块中声明的所有功能。但是,我需要的某些功能在这些块的外部声明。
如果将它们添加到EXPORTS部分,则会出现错误LNK2001 unresolved external symbol XYZ
:(
如果可以避免的话,我不想更改第三方库的源代码。
访问这些功能的最优雅,最简单的方法是什么?
修改
需要澄清的一点是:到目前为止,我想告诉我的接口中没有涉及C ++功能。老实说,我不明白为什么第三方作者不只是将剩余的几个功能包括在extern "C"
块中。这些函数位于头文件的底部,也许添加这些函数的人犯了一个错误,并将其置于extern "C"
块作用域之外。
答案 0 :(得分:2)
对于C ++,一种方法(最恕我直言,恕我直言)将使用为此设计的C ++ / CLI。尤其是如果您不仅具有函数,还具有类。
您创建一个很薄的包装层,这很简单:
赞(未品尝):
C ++ nativ:
In [26]: try:
...: 1/0
...: except ZeroDivisionError:
...: print("Caught")
...: try:
...: pass
...: except ZeroDivisionError:
...: print("Caught Again")
Caught
CLI包装器:
// 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;
};
Here,您会找到一个简短的方法,其中有更详细的说明。
根据您的评论:
[...]尽管我从未使用过C ++ / CLI,但该语言看起来有些混乱。由于项目截止日期已经接近,所以我不确定是否有足够的时间来学习它。我一定会牢记这个选项!
如果您不是,正在寻找最优雅的方式(如您最初的问题),而是寻求最快/最短的方式:对于C ++,一种方式(恕我直言,最短的方式)将使用C ++ / CLI,就是为此而设计的。特别是如果您不仅具有函数,还具有类。您创建了一个非常简单的薄包装层... Here,您可以找到简短的方法(在10分钟之内),该方法对此进行了更详细的描述。