|
|
1
5
回答标题中的问题:不,不能直接将std::string从托管代码封送到非托管代码。查看的答案 another SO question 原因。主要原因是std::string是一个模板,而不是“真正的”类型。 基本上,您需要编写一个小型非托管模块,该模块为openCV函数提供简单的包装器,从而消除STL类型。对于您的示例函数,它可以简单到:
至于字符串偏移量的问题。。。尝试创建一个单独的项目,从一开始就使用“Unmanaged”类型。将项目切换为托管和返回可能会导致项目设置混乱,产生不可预测的后果——至少,我已经遇到过两次这样的问题。。。 |
|
|
2
2
你不应该(不能)传递std::string&在不同的模块(DLL)之间,除非您确定所有模块都是以相同的方式编译的(发布与调试等)。 例如:如果您在发布时编译一个DLL,在调试时编译另一个DLL——那么std::string的内存布局可能会有所不同。 其他编译器设置也可能影响内存布局。 试试这个-将下面的代码编译为发行版与调试版,然后运行它。 在调试中,在relase 28中得到32。
我建议不要使用std::string来跨越模块边界。 |
|
|
3
0
简短回答 : 对 ,如果对DLL和C++/CLI应用程序使用相同的编译器设置,则可以将STL字符串从C++/CLI应用程序传递到本机C++DLL。 密码 :
有关详细信息,请参阅本页: http://msdn.microsoft.com/en-us/library/bb384865.aspx |
|
|
4
0
问题是,默认情况下,Visual Studio 2010为C++和C++/CLI项目使用不同的工具集。这就是为什么STL类具有不同的布局,尽管设置相同。要解决问题,请确保 配置属性/常规/平台工具集 在C++/CLI项目中设置为v100。 |