我有一个可供C#WP应用程序使用的WP C ++运行时组件。
在C ++ Runtime Component中,我有
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();
我有以下问题
答案 0 :(得分:5)
没有任何关系。 C ++ / CX是一种纯粹的非托管语言扩展,旨在使WinRT类型的互操作变得容易。这实际上是COM类型。语法类似于托管C ++ / CLI语言,主要是因为它们旨在解决同样的问题,使非托管类型的互操作变得容易。
您的C#代码中也会出现类似的情况。更不明显的是,您的C#组件将托管类型公开为非托管WinRT类型。利用CLR内置的语言投影。而这反过来又利用了CLR中内置的现有COM互操作。它不是完全不可见的,你必须例如声明你的C#类密封,COM带来的限制只支持接口继承,而不是实现继承。和其他各种花絮一样,只需使用DateTimeOffset而不是DateTime,语言投影的副作用只映射DateTimeOffset。等等。
所以解决你的问题: