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?