我发现至少可以回答我自己的问题的东西。以下两个链接具有Microsoft的wmv文件,这些文件演示了如何在非托管C ++中使用C#类。
第一个使用COM对象并重新填充:http :
//msdn.microsoft.com/zh-cn/vstudio/bb892741。
第二部分使用C ++ / CLI的功能包装C#类:http : //msdn.microsoft.com/zh-
cn/vstudio/bb892742。我已经能够从托管代码中实例化ac#类并检索视频中的字符串。它非常有帮助,但是它只回答了我问题的2/3,因为我想将一个字符串范围为周长的类实例化为ac#类。作为概念证明,我针对以下方法更改了示例中提供的代码,并实现了此目标。当然,我还添加了一个经过更改的{public
string PickDate(string Name)}方法,以对名称字符串进行某些 *** 作以向自己证明它可以工作。
wchar_t * DatePickerClient::pick(std::wstring nme){ IntPtr temp(ref);// system int pointer from a native int String ^date;// tracking handle to a string (managed) String ^name;// tracking handle to a string (managed) name = gcnew String(nme.c_str()); wchar_t *ret;// pointer to a c++ string GCHandle gch;// garbage collector handle DatePicker::DatePicker ^obj;// reference the c# object with tracking handle(^) gch = static_cast<GCHandle>(temp);// converted from the int pointer obj = static_cast<DatePicker::DatePicker ^>(gch.Target); date = obj->PickDate(name); ret = new wchar_t[date->Length +1]; interior_ptr<const wchar_t> p1 = PtrToStringChars(date);// clr pointer that acts like pointer pin_ptr<const wchar_t> p2 = p1;// pin the pointer to a location as clr pointers move around in memory but c++ does not know about that. wcscpy_s(ret, date->Length +1, p2); return ret;}
我的部分问题是:哪个更好?根据我在许多努力研究中所读到的内容,得出的答案是,COM对象被认为更易于使用,而使用包装器可以实现更好的控制。在某些情况下,使用包装器可以(但不总是)减小包装的大小,因为COM对象自动具有标准的尺寸占用空间,并且包装器的大小仅为所需的大小。
重击(如我上面所使用的)是指在COM对象的情况下在C#和C 之间以及在使用C / CLI进行编码的情况下在C / CLI和本机C
之间使用的时空和资源。包装纸。因此,我的回答的另一部分应包括警告,即超出绝对必要超过跨thunk边界是错误的做法,不建议在循环内访问thunk边界,并且可能会错误地设置包装器,从而使thunk翻倍(跨越边界两次,只需要一个重击),而代码对于像我这样的新手来说似乎是不正确的。
关于wmv的两个注释。首先:某些素材可以在两者中重复使用,请勿上当。乍一看,它们看起来是相同的,但它们确实涵盖了不同的主题。其次,有一些额外的功能,例如编组,现在已成为CLI的一部分,而wmv并未涵盖。
编辑:
请注意,这将对您的安装造成影响,CLR将找不到您的c 包装器。您将必须确认c
应用程序安装在使用它的任何/每个目录中,或者在安装时将库(然后需要强命名)添加到GAC。这也意味着,无论哪种情况,在开发环境中,您都可能必须将库复制到应用程序调用它的每个目录中。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)