【问题标题】:What causes this error in a C++ app calling a C# DLL?在调用 C# DLL 的 C++ 应用程序中导致此错误的原因是什么?
【发布时间】:2014-01-30 21:23:08
【问题描述】:

在 .Net 之前我没有使用 C++ 编程——对于 Windows,我现在使用 C# 和 .Net。

我有一个从其他 C# 程序调用的 C# .Net DLL,没有任何问题。但是我有一个客户想从 C++ 调用它,所以我正在编写一个练习应用程序来看看它是如何完成的。 注意这是 C++/CLI,即它是一个托管的 CLI-CIL-CLR 应用程序。

在我的 C# 程序中,我将我的 DLL 添加为引用,然后在我的代码中我有一个 using 语句,然后实例化它。 . .

    using ScannerBeam;
    . . . 

    CScannerBeam SB = new CScannerBeam();

。 . .工作一种享受,没有问题。但在 C++ 中,我还将 DLL 添加为引用并执行

    using namespace ScannerBeam;
    . . . 

    CScannerBeam SB = gcnew CScannerBeam();

...我得到一个错误。 . .

错误 1 ​​错误 C3673: 'ScannerBeam::CScannerBeam' : 类没有复制构造函数

为什么 C# 不需要复制构造函数?它需要一个深拷贝还是只需要一个浅拷贝?我需要知道从(托管/CLI/CLR)C++ 调用 C# DLL 的任何其他问题?

【问题讨论】:

  • 我觉得你需要CScannerBeam^
  • 欢迎来到对象有内容的 C++ - 在 C++/cli 中,您必须处理托管指针 T^(指针 T*、引用 T& 和普通值 T)
  • @DieterLücking:T^ 是一个“跟踪句柄”。并且不要忘记跟踪参考T%。还有interior_ptr<T>
  • 宾果游戏。我猜 C++ 自古以来已经发生了变化。

标签: c# .net dll c++-cli


【解决方案1】:

Ref 类需要 refptrs,CScannerBeam^ 表示 C++-CLI 中的 ref_ptr。

【讨论】:

  • 没那么多。 CScannerBeam SB; 是有效的(堆栈语义),但你不会使用 gcnew 来初始化它。
【解决方案2】:

gcnew 计算为 CScannerBeam^ 类型的跟踪句柄

您的代码与:

std::string s = new std::string();

这也是一个错误,右边是指针,左边不是。

就像原生 C++ 一样,使用任何一个

CScannerBeam SB; // creates an object with stack semantics
                 // it will be disposed at end the of the scope
func(sb.member);

CScannerBeam^ pSB = gcnew ScannerBeam(); // get handle to object on managed heap
                                         // it has dynamic lifetime and will live as
                                         // long as the .NET garbage collector can reach it
func(pSB->member);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多