Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 你会用C++;以C++/CLI WinForms应用程序?_C#_.net_Visual C++ - Fatal编程技术网

C# 你会用C++;以C++/CLI WinForms应用程序?

C# 你会用C++;以C++/CLI WinForms应用程序?,c#,.net,visual-c++,C#,.net,Visual C++,您可以创建一个在CLR上运行的VC++ Windows窗体项目,它本质上是用C++编写的.NET应用程序。你能直接从这样的项目中使用非托管C++库吗?这是否意味着库必须在.NET下编译和运行?或者您必须为这些库编写代码,并且只有这些库才能从CLR应用程序中使用?是。这里有一些指南。混合CLI/C++和本机代码。在CLI/C++中使用它们不需要包装器。事实上,您可以使用CLI/C++和本机代码来创建包装器 如果您实际上正在尝试制作一个包装器以在C#中使用,它应该如下所示: #include "

您可以创建一个在CLR上运行的VC++ Windows窗体项目,它本质上是用C++编写的.NET应用程序。你能直接从这样的项目中使用非托管C++库吗?这是否意味着库必须在.NET下编译和运行?或者您必须为这些库编写代码,并且只有这些库才能从CLR应用程序中使用?

是。这里有一些指南。混合CLI/C++和本机代码。在CLI/C++中使用它们不需要包装器。事实上,您可以使用CLI/C++和本机代码来创建包装器

如果您实际上正在尝试制作一个包装器以在C#中使用,它应该如下所示:

#include "NativeClass.h"

public ref class NativeClassWrapper {
    NativeClass* m_nativeClass;

public:
    NativeClassWrapper() { m_nativeClass = new NativeClass(); }
    ~NativeClassWrapper() { delete m_nativeClass; }
    void Method() {
        m_nativeClass->Method();
    }

protected:
    // an explicit Finalize() method—as a failsafe
    !NativeClassWrapper() { delete m_nativeClass; }
};

请参阅

使用智能指针库可以更简单地管理本机(非垃圾收集)对象的分配,这在出现异常、多次调用
Dispose()
、忘记调用
Dispose()
等情况下非常困难

以下是阿西克博士的例子,改写为使用:

#包括“clr_作用域_ptr.h”
#包括“NativeClass.h”
公共引用类NativeClassWrapper{
clr_范围的ptr m_nativeClass;
公众:
NativeClassWrapper()m_nativeClass(新的nativeClass()){}
//自动生成的析构函数是正确的
//自动生成的终结器是正确的
void方法(){
m_nativeClass->Method();
}
};

对于字符串转换,请使用Microsoft为此提供的
marshal_as
类。在这里查看ildjarn的答案:

是的,这就是你制作包装纸的方法。:]这是如何创建包装器,但是如果您在C++中使用它,则不需要。如果你想把它带到C#,那么是的,这就是你需要的。我注意到您标记了C#,所以可能这就是您想要做的。更好的主意是:使用一个工作智能指针,例如,而不是在每个包装器类中复制内存清理代码。例如,此答案存在内存泄漏。@Geotarget:上面的代码没有包含终结器,因此如果忘记调用
Dispose()
,它将泄漏。或者,如果您多次调用
Dispose()
(是的,在.NET中这是合法的),就会发生不好的事情。只需替换
NativeClass*m_NativeClass具有
clr\u范围的\u ptr m\u本地类
和编译器将为您正确生成析构函数和终结器。@Geotarget和BenVoigt我个人会坚持使用创建包装器的简单方法,直到您更好地掌握主题为止,但bookmark Bens会在您想要优化解决方案时提供答案。这是创建包装器的基础。但是,是的,这些是你需要的步骤。创建新的CLI/C++项目,包括库并将其编译为DLL。然后导入DLL并将原始库复制到您的新C#项目中。感谢您明智的回答,Ben,我接受它,直到有人想出更好的答案。你似乎是一个C++ C++专家,你在这个问题上的评论(黄金C++徽章,有多少人有?)所以我相信你在这里确切地知道你在说什么。与我自己相比,我是一个初学者。好。。总有一天@Geotarget:所以代表和徽章不是最可靠的指标,但我喜欢认为我给出了很好的答案。继续练习,你也会发展专业知识。你能告诉我一点关于C语言数据类型转换为C++和CB的吗?只是字符串和整数/双精度的基础知识。我这里有一些字符串的参考代码:但是所有的东西都很脆弱。
#include "clr_scoped_ptr.h"
#include "NativeClass.h"

public ref class NativeClassWrapper {
    clr_scoped_ptr<NativeClass> m_nativeClass;

public:
    NativeClassWrapper() m_nativeClass(new NativeClass()) {}
    // auto-generated destructor is correct
    // auto-generated finalizer is correct

    void Method() {
        m_nativeClass->Method();
    }
};