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

标签 c# c++ dll

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

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

导入此文件后,

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

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

error C2380: type(s) preceding 'Accepted_Bills' (constructor with return type, or illegal redefinition of current class-name?) d:..\abcd.tlh

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

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

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

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

最佳答案

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

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

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

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

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

关于c# - 在 C++ 中使用 C# dll 时出现 C2380 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16585378/

相关文章:

c# - MySql Connector - 非阻塞套接字操作@nonQuery

c++ - 可选择将函数变量作为参数

c++ - 返回变量为 void (*)(void)

c++ - O(N) 中的锦标赛获胜者和 O(NLogN) 中的玩家排名

c++ - Delphi/C++ DLL 问题 - unsigned long 与 unsigned int?

c# - 你将如何实现? : Lots of rules over a tree in C#

c# - 数据库的跨平台加密

C# 将 Winforms 连接到在线主机 (goDaddy)

c++ - C/FORTRAN 将双下溢设置为零

c++ - 打印出字符串指针中获取的数据时出错