0

我有一个内置 C# 代码的 Dll,由于某些需要,我想将它与 C++ 代码一起使用。

经过长时间的搜索,我找到了一个解决方案,并使用 RegASM.exe 从我的 abcd.dll 文件中创建了 abcd.tlb。

导入此文件后,

#import "D:\\..\\abcd.tlb" raw_interfaces_only

当我构建我的解决方案时,会发生错误,

错误 C2380:“Accepted_Bills”之前的类型(具有返回类型的构造函数,或当前类名的非法重新定义?)d:..\abcd.tlh

当我搜索这个错误时,我知道了一个结构,

struct __declspec(uuid("23dbd772-5aa8-3b5a-90a1-b19e4a052166"))
Accepted_Bills
{
    long Denomination;
    __int64 Accepted_Bills;
};

与其成员之一同名。这在 C++ 中是不允许的。我正在使用 Visual Studio 2010 来编译它。

谁能帮我消除这个错误。非常感谢!

4

2 回答 2

2

最简单的解决方案是更改接口托管端的声明。更改结构或字段的名称。

如果您不想这样做,则需要在 C++ 代码中进行更改。例如:

struct __declspec(uuid("23dbd772-5aa8-3b5a-90a1-b19e4a052166"))
Accepted_Bills
{
    long Denomination;
    __int64 _Accepted_Bills;
};

每次构建并切换到手动生成时,您都需要停止自动生成头文件。

在我看来,由于您控制界面的两侧,因此更改 C# 代码是迄今为止最简单的解决方案。

于 2013-05-16T10:49:08.987 回答
1

您需要 Accepted_Bills 类型吗?

您可以告诉 VS 将其从您的输入端口中排除。

#import "D:\\..\\abcd.tlb" raw_interfaces_only exclude("Accepted_Bills")

尝试尝试其他导入选项,例如high_method_prefix("Prefix")或可能auto_renamerename(...)

于 2013-05-16T11:05:11.777 回答