您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何从本机C ++调用C#库(使用C ++ \ CLI和IJW)

如何从本机C ++调用C#库(使用C ++ \ CLI和IJW)

我发现至少可以回答我自己的问题的东西。以下两个链接具有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。这也意味着,无论哪种情况,在开发环境中,您都可能必须将库复制到应用程序调用它的每个目录中。

c# 2022/1/1 18:17:27 有547人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶