2010-06-18 4 views
0

에서 COM 객체를 생성하는 코드 샘플 방법 GetSettings에게 (사용자 이름).NET의 COM 방법 다음

settings = factory.GetSettings(userName); 
key = settings.PrivateKey //<--- Exception occurs saying "Read write from protected memory is not allowed" or something like this. 

문제 VB6 코드에서 SettingsFactory COM 클래스를 생성하고 호출 할 때 문제가

[Guid("159463FB-A87A-4BBB-BCA1-064CD84495FB")] 
    public interface ISettingsFactory 
    { 
     ISettings GetSettings(string userName); 
    } 

    [Guid("FD11B979-0ED1-41fb-8EB0-1234512345D0")] 
    public interface ISettings 
    { 
     string PrivateKey {get;} 
    } 

    [Guid("782937826-705F-4be2-1234-A748332D6D1")] 
    [ClassInterface(ClassInterfaceType.None)] 
    public class SettingsFactory : ISettingsFactory 
    { 
     public ISettings GetSettings(string userName) 
     { 
      return new Settings(userName); 
     } 
    } 

    [Guid("8BDC1F18-48FD-4a49-8DF3-D81C6321657B")] 
    [ClassInterface(ClassInterfaceType.None)] 
    public class Settings : ISettings 
    { 
     private readonly PrivateData privateData; 

     public Settings(string userName) 
     { 
      privateData= PrivateData.Load(userName); 
     } 

     public string PrivateKey 
     { 
      get { return privateData.Key; } 
     } 
    }  

에게 있습니다 GetSettings 메서드에서 Settings 인스턴스를 SettingsFactory 필드에 저장하면 GC가 해당 인스턴스를 수집하지 않습니다. 아무도 왜 이런 일이 일어나는 지 알고 있습니까? GC가 COM에 노출 된 개체를 수집하는 이유는 무엇입니까? GetSettings가 호출 된 후 RCW가 Settings 개체의 참조 번호를 증가시키지 않았습니까?

답변

0

문제는 privateData.Key가 올바르게 정렬되지 않는다고 생각합니다. Key의 유형에 대한 정의를 볼 수는 없지만 일종의 데이터에 대한 ptr이며이 데이터는 올바르게 정렬되지 않습니다. 그럴 경우 Marhal.PtrToXXX fumctions 중 하나를 사용해야합니다.

.net에서 COM 개체를 사용하는 방법에 대해 자세히 알고 싶다면 Runtime Callable Wrappers

에 대한 MSDN 문서를 참조하십시오.
관련 문제