【发布时间】:2026-01-29 18:05:01
【问题描述】:
我正在尝试对我继承的一些 c++ 代码进行正确的 c++/cli 包装,以控制一些实验室设备,以便我可以从其他 .net 语言调用代码。我有几个问题一直找不到答案。 c++ 代码定义了以下内容:
typedef struct{
bool val;
/* Some more c++ fundamental types ...*/
char char_array[32];
unsigned char unsigned_char_array[128];
RECT rect;
} UnmangedStruct, *LpUnmanagedStruct;
我的包装结构如下:
public ref structure ManagedStruct{
bool val;
/* Some more c++ fundamental types ...*/
System::String^ char_array;
System::String^ unsigned_char_array;
System::Drawing::Rectangle disp_rect;
}
我知道尝试编写一些辅助函数来在两个结构之间进行转换。
问题:
1) *LpUnmanagedStruct 有什么作用?它是否初始化了这个结构的一个新实例并将 *LpUnmanaged 指向它?
2) String^ 是包装 char[] 和 unsigned char[] 的正确托管类型吗?矩形 矩形?
3) 我想知道的主要事情是如何转换 String^ 或任何用于包装 char[] / unsigned char[] 的正确类型,反之亦然,当只有 char* 可以传入和返回时一个函数。我在许多帖子中看到您应该将所有内容都转换为使用 char*,但如果我能提供帮助,我真的不想修改原始 c++。
【问题讨论】:
-
你没有包装任何东西。 char_array 成员应该是一个属性,而不是使用非托管成员。并有一个更好的名字:) 当字符串不适合时,在 setter 中抛出异常。请改用
ref class,这样您就可以使用private 隐藏本机结构。如果你包装一个指向结构的指针而不是结构本身,那么你需要一个析构函数和终结器。 -
在您甚至不了解普通 C 和 C++ 的情况下使用 C++/CLI 只会以痛苦告终。但是this C++/CLI smart pointer I wrote can help,这样您就不必手动编写提到的处理程序和终结程序 Hans。 (.NET 类型没有析构函数,只有
Dispose和Finalize) -
@HansPassant 再次感谢汉斯。我会将您的建议和下面答案中的建议结合起来,看看我是否可以得到一些工作。并将在我的答案下方添加工作代码作为编辑。
标签: .net visual-c++ c++-cli wrapper