2013-07-11 1 views
5

WP C++ 런타임 구성 요소가 C# WP 응용 프로그램에서 사용됩니다. C++ 런타임 구성 요소에서 C# 및 C++/CX 객체는 어떻게 관련되어 있습니까?

, 나는 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(); 

    }; 

을 가지고, 나는 ICallback를 구현 CallbackImp을 보유하고 있습니다. 그리고 나는 다음과 같은 질문

  1. CB닷컴 개체를 관리 한

    CallbackImp cb = new CallbackImp(); 
    WindowsPhoneRuntimeComponent com = new WindowsPhoneRuntimeComponent(); 
    
    // Set callback 
    com.SetCallback(cb); 
    
    // Get dictionary 
    IDictionary<string, object> dict = com.CreateDictionary(); 
    

    을한다. 그렇다면 C++/CX 객체는 어디에 있습니까? 나는 는 (네이티브 힙에 상주) 일부 C++/CX 객체에 CB닷컴 포인트를 잘 들었어요? CB닷컴는 .NET GC에 의해 발표된다

  2. , 어떻게 C++/CX는 다음 해제되는 객체인가?
  3. 내가 런타임 구성 요소에 CB을 통과 CB는 또는 기본 힙 관리에 속하나요?
  4. dict 어디서 살고 있습니까? 누가 그것을 풀어 주겠습니까?

답변

5

아무 관계가 없습니다. C++/CX는 순수한 관리되지 않는 언어 확장으로서 WinRT 유형의 interop을 쉽게 만들 수 있도록 설계되었습니다. 어떤 것이 실제로 후드 아래의 COM 유형입니까? 은 매니지드 C++/CLI 언어 인과 비슷합니다. 주로 동일한 문제를 해결하도록 설계 되었기 때문에 관리되지 않는 유형의 interop을 쉽게 만듭니다.

C# 코드에서도 비슷한 점이 발생합니다. 눈에 띄지 않게 C# 구성 요소가 관리되는 형식을 관리되지 않는 WinRT 형식으로 표시합니다. CLR에 내장 된 언어 프로젝션을 활용합니다. CLR에 내장 된 기존 COM interop을 활용합니다. 완전히 보이지는 않습니다. 예를 들어, C# 클래스 을 봉인으로 선언해야합니다. COM에서 구현 상속이 아니라 인터페이스 상속만을 지원하는 제한이 있습니다. 그리고 DateTimeOffset 대신 DateTimeOffset을 사용하는 것과 같은 언어 프로젝션의 부작용 인 DateTime 대신에 DateTimeOffset을 사용하는 등의 여러 가지 유용한 정보도 있습니다. 기타.

그래서 귀하의 질문에 주소 :

  1. 그들은 COM 서버의 구현 세부이며, 여기에는 C++/CX 객체가 없습니다. WinRT 개체를 만드는 기본 저수준 API는 COM CoCreateInstance() 함수와 동일한 동물 인 RoCreateInstance()입니다. 클래스 팩터 리를 사용하여 객체를 생성합니다. 객체는 서버가 소유하며 일반 COM 인터페이스 포인터를 넘어서는 다른 코드에 전혀 노출되지 않습니다.
  2. 메모리는 COM 및 WinRT에서 참조 카운팅을 통해 관리됩니다. IUnknown :: AddRef()는 참조를 추가하고 IUnknown :: Release()는 참조를 해제합니다. 서버는 마지막 Release 호출이 카운트를 0으로 감소시킬 때 객체를 파괴합니다.AddRef() 호출은 자동으로 ref 새로운 또는 C++/CX 코드의 객체 참조 할당 문으로 생성되며 C++/CX 참조가 범위를 벗어날 때 컴파일러에서 자동 생성됩니다. COM 코드에서 사용하는 CComPtr 및 _com_ptr_t 래퍼 클래스와 똑같은 동작을하지만 스마트 포인터를 직접 작성하지 않아도 컴파일러가 처리한다는 차이점이 있습니다. CCW가 보유한 관리 객체 참조를 제거하는 추가 세부 정보가 있습니다. 결국 GC가 C# 개체를 가비지 수집 할 수있게합니다.
  3. cb 개체가 GC 힙에 있습니다. 위에서 언급했듯이 COM은 인터페이스 포인터 만 노출하며 WinRT는 개체가 실제로 사는 위치를 전혀 모르고 있습니다. 클래스 팩토리와의 IUnknown 방법은 내가 C#에서 새 WindowsPhoneRuntimeComponent()를 호출하면 세부
  4. 같은
+0

1. 3. 같이 WindowsPhoneRuntimeComponent의 생성자를 호출 해 있음을 숨기기 때문에 C++/CX이 있어야합니다 네이티브 힙 어딘가에있는 객체? 런타임 구성 요소 프로젝트에서 새로 참조 할 때 새롭게 생성 된 객체의 주소를 볼 수 있습니다. "객체가 서버에 소유 됨"은 무엇을 의미합니까? 2. "C++/CX 참조가 범위를 벗어납니다 "? 나는 개인적으로 cb와 com이 관리 힙에 있다고 생각하기 때문에 GC는 언제 그 파일을 공개할지 결정할 것이며 이는 C++/CX 객체로도 이어질 것입니다. – onmyway133

+0

자신의 정신 모형을 공장. 그러나 매우 정확한 것은 아닙니다. WinRT 유형을 이해하려면 COM을 이해해야합니다. 행운을 빈다. –

+0

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 형식은 원시 힙에 만들어지며 가비지 수집되지 않습니다. 말한대로 다시 계산됩니다 .C# 또는 VB 호출자가 GC 컬렉션을 통해 예상 .NET 개체를 릴리스 할 때마다 참조 카운트가 0이되면 소멸자 (있는 경우)가 호출되고 메모리가 할당 해제됩니다 " – onmyway133

관련 문제