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

C2380 error while using C# dll in C++

本文关键字:C2380 错误 dll c++      更新时间:2023-10-16

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

经过长时间的搜索,我找到了一个解决方案并创建了abcd。

使用RegASM.exe从我的abcd.dll文件中删除。

导入该文件后,

#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来编译这个。

有谁能帮我删除这个错误吗?提前非常感谢!!

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

如果你不想这样做,你需要在你的c++代码中进行修改。例如:

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

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

在我看来,既然你控制了接口的两边,改变c#代码是目前为止最简单的解决方案。

是否需要Accepted_Bills类型?

你可以告诉VS从你的导入中排除它。

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

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