【发布时间】:2011-03-05 12:05:48
【问题描述】:
这是一个代码示例
[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; }
}
}
问题是从 VB6 代码创建 SettingsFactory COM 类并调用方法 GetSettings(userName)
settings = factory.GetSettings(userName);
key = settings.PrivateKey //<--- Exception occurs saying "Read write from protected memory is not allowed" or something like this.
当我在 GetSettings 方法中将 Settings 实例保存在 SettingsFactory 的字段中时,问题就消失了,这样 GC 就不会收集它。有谁知道为什么会这样?我的意思是为什么 GC 会收集暴露给 COM 的对象?调用 GetSettings 后,RCW 不会增加 Settings 对象上的 ref 数吗?
【问题讨论】: