在C ++中使用C#dll时出现C2380错误

时间:2013-05-16 10:46:22

标签: c# c++ dll

我有一个内置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来编译它。

任何人都可以帮我删除此错误。 Thanx提前很多!!

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:1)

您需要Accepted_Bills类型吗?

You can tell VS to exclude it from your inport.

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

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