加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows-phone-8 – C#和C/C++X对象如何相关?

发布时间:2020-12-14 01:53:30 所属栏目:Windows 来源:网络整理
导读:我有一个将由C#WP应用程序使用的WP C运行时组件. 在C运行时组件中,我有 public interface class ICallback { public: virtual void DoSomething(); };public ref class WindowsPhoneRuntimeComponent sealed { public: WindowsPhoneRuntimeComponent(); void
我有一个将由C#WP应用程序使用的WP C运行时组件.

在C运行时组件中,我有

public interface class ICallback
    {
    public:
        virtual void DoSomething();
    };

public ref class WindowsPhoneRuntimeComponent sealed
    {
    public:
        WindowsPhoneRuntimeComponent();
        void SetCallback(ICallback ^callback);
        IMap<Platform::String^,Platform::Object^>^ CreateDictionary();

    };

在C#应用程序中,我有
CallbackImp,实现ICallback.然后我做

CallbackImp cb = new CallbackImp ();
WindowsPhoneRuntimeComponent com = new WindowsPhoneRuntimeComponent();

// Set callback
com.SetCallback(cb);

// Get dictionary
IDictionary<string,object> dict = com.CreateDictionary();

我有以下问题

> cb和com是托管对象.那么C/C++X对象在哪里呢?我有
听说cb和com指向一些C/C++X对象(驻留
在原生堆上),对吗?
>如果.NET GC发布了cb和com,那么C/C++X对象是怎样的
然后发布?
>当我将cb传递给Runtime组件时,cb是否属于managed
还是本机堆?
> dict在哪里居住?谁会释放它?

解决方法

没有任何关系. C/C++X是一种纯粹的非托管语言扩展,旨在使WinRT类型的互操作变得容易.这实际上是COM类型.语法类似于托管的C/C++LI语言,主要是因为它们旨在解决相同的问题,使得非托管类型的互操作变得容易.

类似的东西也会出现在你的C#代码中.更不明显的是,您的C#组件将托管类型公开为非托管WinRT类型.利用CLR内置的语言投影.而这反过来又利用了CLR中内置的现有COM互操作.它不是完全不可见的,你必须例如声明你的C#类是密封的,COM带来的限制只支持接口继承,而不是实现继承.和其他各种花絮一样,只需使用DateTimeOffset而不是DateTime,语言投影的副作用只映射DateTimeOffset.等等.

所以解决你的问题:

>这里没有C/C++X对象,它们是COM服务器的实现细节.创建WinRT对象的底层低级API是RoCreateInstance(),与COM CoCreateInstance()函数相同.它使用类工厂来创建对象.该对象由服务器拥有,它不会暴露给普通COM接口指针之外的其他代码.>通过引用计数在COM中管理内存,从而管理WinRT. IUnknown :: AddRef()添加了一个引用,IUnknown :: Release()发布了一个引用.当最后一次Release调用将计数减少到0时,服务器会销毁该对象.在C/C++X代码中自动生成一个ref new或对象引用赋值语句的AddRef()调用,Release()由编译器自动生成您的C/C++X参考超出范围.与您在COM代码中使用的CComPtr和_com_ptr_t包装类完全相同的行为,但区别在于编译器会处理它而不是您必须自己创建智能指针.通过附加细节,这将删除CCW持有的托管对象引用.最终,它允许GC垃圾收集C#对象.> GC堆上存在cb对象.如上所述,COM只公开接口指针,WinRT完全不知道对象实际存在的位置.类工厂和IUnknown方法隐藏了这个细节>与3相同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读