这是一个代码示例
[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方法中,问题消失了,我在SettingsFactory字段中保存了Settings实例,因此GC不会收集它。有谁知道为什么会这样?我的意思是为什么GC收集暴露给COM的对象?在GetSettings被调用后,RCW是否增加了Settings对象上的引用号?
答案 0 :(得分:0)
我认为问题是privateData.Key没有被正确编组。我看不到Key类型的定义,但我的猜测是它是某种数据的ptr,而且这些数据没有被正确编组。如果是这种情况,您可能需要使用Marhal.PtrToXXX之一。
如果您想了解有关使用.net的COM对象的更多信息,那么一个很好的起点是Runtime Callable Wrappers上的MSDN文章