【发布时间】:2010-10-26 23:13:48
【问题描述】:
从 C#.NET CF 修改要与 pInvoke 一起使用的 C++ 程序的最佳方法是什么?
我有一个大量使用 STL 的大型 C++ 代码库。即迭代器、容器类和标准字符串。
除此之外,许多轻量级类都是按值传递的。
我想在这个代码库的基础上为 Windows 移动触摸设备构建一个 C# gui。
值得吗?
我已经设法获得了一些使用 pInvoke 从 C#.NET 调用 C++ 代码的示例,但是为每个访问点和所有 STL 返回类型编写包装器似乎非常令人生畏和丑陋。还有其他方法还是我有点吃饱了?
顺便说一句。托管 C++ 不是一个选项,因为 .NET CF 不以任何形式支持它。
--编辑: 我有一个关于 pinvoke 的具体问题。
假设您有一个按值返回 C++ 字符串的函数
std::string foo () {
return std::string ("Hi");
}
我知道不可能使用 pinvoke 从 C# 调用此函数,因为无法编组 STL 字符串,但我的问题是我什至无法在不分配新数组的情况下编写包装器,因为 std::string返回的不在堆上。
char* foo2 () {
return foo().c_str(); //Very bad
//the returned pointer is released when the std::string falls out of scope.
//and will be invalid before the caller is able to do anything with it.
}
所以我的问题是,如何将 foo 包装成 pInvoke 合适的格式而不需要重新分配整个字符串。
char* foo2 () {
std::string f = foo();
char* waste = new char[f.length()+1];
strcpy (waste, f.c_str());
return f;
}
对需要返回 std::string 的每个点都执行上述操作的想法足以让我放弃尝试使用 C#。
【问题讨论】:
标签: c# c++ .net pinvoke windows-mobile