在调用C#DLL的C ++应用程序中导致此错误的原因是什么?

时间:2014-01-30 21:23:09

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

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

我有一个C#.Net DLL,我从其他C#程序调用没有问题。但我有一个客户想要用C ++调用它,所以我正在编写一个练习应用程序,看看它是如何完成的。的 N.B。这是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#不需要复制构造函数?它需要深层复制还是只需要浅层复制?我需要知道从(managed / CLI / CLR)C ++调用C#DLL的任何其他问题?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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);