【发布时间】:2011-10-07 14:19:50
【问题描述】:
一直在编写一些 C++/CLI 来包装现有的非托管 C++ 库,从托管类型转换为非托管类型的问题出现了。一个简单的例子是将 std::string 转换为 System::String 但该原理适用于许多类型,即数组 -> 向量。编写了一些转换函数后,我决定将它们打包到一个程序集中,以便我可以重用它们。鉴于全局 C++/CLI 函数在当前程序集之外不可见,我最终得到了这样的结果
public ref class ClassJustToContainStaticFunctions
{
public:
static std::string convert( System::String^ s )
{
msclr::interop::marshal_context context;
return( context.marshal_as<std::string>( s ) );
}
};
这符合要求,但函数 convert 不会在程序集之外公开可见,因为它在签名中使用了非托管类型,请参阅此处 http://msdn.microsoft.com/en-us/library/ms235607%28v=VS.100%29.aspx 了解更多信息。解决方法通常是添加
#pragma make_public(std::string)
到文件中,我在其他情况下也这样做了,没有问题。但是 make_public 不适用于像 std::string 这样的模板类。请参阅此处http://msdn.microsoft.com/en-us/library/ms235343%28v=vs.80%29.aspx 了解一些信息。
例如,我发现了一些变通方法,但它们看起来都很丑。
那么,毕竟,我的问题是我在这里遗漏了一些明显的东西吗?在我看来,从托管类型转换为非托管类型,特别是对于容器类,即 STL.NET Unmanged STL 将是一个常见问题,但经过大量搜索后,我没有找到太多关于该主题的内容。
【问题讨论】:
-
我已经阅读了 4121249 问题,这是我提到的“非常丑陋”的解决方法之一。还是谢谢
标签: .net stl c++-cli interop mixed-mode