2010-06-18 4 views
0

Voici un exemple de codeCréer un objet COM à partir de la méthode .NET 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; } 
     } 
    }  

Le problème est lors de la création de classe SettingsFactory COM à partir du code VB6 et appeler GetSettings méthode (userName)

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

Le problème disparaît lorsque dans la méthode GetSettings je sauvegarde l'instance de paramètres dans le champ de SettingsFactory, de sorte que GC ne la collecte pas. Est-ce que quelqu'un sait pourquoi cela se passe-t-il? Je veux dire pourquoi GC recueille des objets qui sont exposés à COM? RCW n'augmente-t-il pas le numéro de référence de l'objet Settings après l'appel de GetSettings?

Répondre

0

Je pense que le problème est que privateData.Key n'est pas organisé correctement. Je ne peux pas voir la définition pour le type de clé, mais je suppose que c'est un ptr à un certain type de données et que ces données ne sont pas organisées correctement. Si c'est le cas, vous devez probablement utiliser l'une des fumcations Marhal.PtrToXXX.

Un excellent point de départ si vous souhaitez en savoir plus sur l'utilisation des objets COM à partir de .net sont les articles MSDN sur Runtime Callable Wrappers