Ich habe eine WP C++ Runtime-Komponente, die von einer C# -WP-Anwendung verbraucht werden soll. Runtime-KomponenteWie hängen C# - und C++/CX-Objekte zusammen?
In C++, habe ich
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();
};
In C# Anwendung, ich habe CallbackImp
, die ICallback
implementiert. Dann mache ich
CallbackImp cb = new CallbackImp();
WindowsPhoneRuntimeComponent com = new WindowsPhoneRuntimeComponent();
// Set callback
com.SetCallback(cb);
// Get dictionary
IDictionary<string, object> dict = com.CreateDictionary();
Ich habe folgende Fragen
- cb und com werden verwaltete Objekte. Wo sind die C++/CX-Objekte? Ich habe gehört, dass cb und com zeigen Sie auf einige C++/CX-Objekte (die auf native Heap residieren), richtig?
- Wenn cb und com von .NET GC freigegeben werden, sind, wie C++/CX dann released Objekte?
- Als ich cb auf die Runtime-Komponente übergeben, wird cb gehört oder native Heap verwaltet?
- Wo befindet sich dict? Wer wird es veröffentlichen?
1. Wenn ich neue WindowsPhoneRuntimeComponent() aufrufen, in C#, der Konstruktor des WindowsPhoneRuntimeComponent dann aufgerufen wird, so muss es C++/CX sein Objekt befindet sich irgendwo im nativen Heap? Auch wenn ich neu in Runtime-Komponente Projekt, kann ich die Adresse des neu erstellten Objekts sehen, was meinen Sie mit "Das Objekt gehört dem Server" 2. Was meinst du mit "wenn Ihre C++/CX-Referenz geht nicht in den Geltungsbereich "? Ich persönlich denke, dass cb und com in verwalteten Heap sind, so dass der GC entscheiden wird, wann sie veröffentlicht werden, und dies wird dazu führen, dass die C++/CX-Objekte auch freigegeben werden. – onmyway133
Es ist in Ordnung, Ihr eigenes mentales Modell darüber zu machen funktioniert. Es ist jedoch nicht sehr genau. Sie müssen COM verstehen, um WinRT-Typen zu erstellen. Viel Glück damit. –
Nach http://social.msdn.microsoft.com/Forums/windowsapps/en-US/d41b7773-d85e-4d1c-97a1-2c8579da62c2/how-does-memory-allocation-work-with-native-winrt-types -in-managed-code "WinRT-Typen werden auf dem systemeigenen Heap erstellt, sie werden nicht als Garbage Collection erfasst. Wie Sie bereits sagten, werden sie gezählt. Wenn ein C# - oder VB-Aufrufer ein projiziertes .NET-Objekt über eine GC-Sammlung freigibt Das zugrundeliegende RT-Objekt erhält seine ref-Zählung dekrementiert Wenn die ref-Zählung 0 erreicht, wird ihr Destruktor (falls vorhanden) aufgerufen und der Speicher wird freigegeben " – onmyway133