当前位置: 首页 > 编程语言 > C#

C++Interop:如何从本机C++调用C#类,并且该类是非静态的?

时间:2023-04-10 21:52:05 C#

C++互操作:如何从本机C++调用C#类,并且该类是非静态的?我有一个用本机C++编写的大型应用程序。我还有一个需要调用的C#类。如果C#类是静态的,那将是微不足道的(网络上有很多示例)——只需编写一个混合C++/CLI包装器,导出接口,就大功告成了。但是,C#类是非静态的,不能更改为静态的,因为它有一个接口(如果您尝试将C#类设置为静态的,编译器将生成错误)。有没有人遇到过这个问题——如何将非静态C#类导出到本机C++?更新2010-11-09最终解决方案:试试COM,效果很好,但不支持结构。所以,使用C++/CLI包装器,因为我绝对需要能够在C++和C#之间传递结构。我根据此处的代码编写了一个混合模式.dll包装器:由于目标类是非静态的,因此我不得不使用单例模式来确保我只实例化了目标类的一个副本。这确保一切都足够快以满足规格。如果您希望我发布一个演示项目,请与我联系(尽管公平地说,我从C++调用C#,现在大多数人都想从C#调用C++)。与静态类一样,C++/CLI或COM互操作也适用于非静态类。使用C++/CLI,您只需引用包含非静态类的程序集,然后您可以使用gcnew获取对新实例的引用。是什么让您认为您的非静态类不可能做到这一点?编辑:这是示例代码。使用命名空间系统;publicrefclassCSquare{private:doublesd;public:CSquare():sd(0.00){}CSquare(doubleside):sd(side){}~CSquare(){}propertydoubleSide{doubleget(){returnsd;}voidset(doubles){if(s^CreateSquares(){array^sqrs=gcnewarray(5);sqrs[0]=gcnewCSquare;sqrs[0]->Side=5.62;sqrs[1]=gcnewCSquare;sqrs[1]->Side=770.448;sqrs[2]=gcnewCSquare;sqrs[2]->Side=2442.08;sqrs[3]=gcnewCSquare;sqrs[3]->Side=82.304;sqrs[4]=gcnewCSquare;sqrs[4]->Side=640.1115;returnsqrs;}我想到了两个选项。将类公开为COM对象并将其用作COM对象。创建一个静态C#类,将接口公开到与非静态C#类交互。几年前我研究过这个主题:我想在本机代码中使用log4net和Npgsql库,即使没有/clr键也可以编译。PaulDiLascia描述了这项技术背后的主要思想在他的两篇非凡文章中:VisualStudio2005中的托管代码使用我们的ManWrap库在本机C++代码中获得最佳.NET这个解决方案的主要思想是gcroot智能指针和intptr_t在内存中具有完全相同的表示。我们创建了一个名为GCROOT(T)的宏,它在托管代码中使用gcroot,在非托管代码中使用intptr_t。我们创建一个具有本机接口和托管实现的DLL,并使用本机代码中的dll。我很容易为托管类创建一些适配器并在本机C++世界中使用它们,甚至在没有/clr密钥的情况下编译我的源代码。以上是C#学习教程:C++Interop:HowtocallaC#classfromnativeC++,andtheclassisnon-static?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: