首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从.NET COM方法创建COM对象

从.NET COM方法创建COM对象
EN

Stack Overflow用户
提问于 2010-06-18 23:38:40
回答 1查看 651关注 0票数 0

下面是一个代码示例

代码语言:javascript
复制
    [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; }
         }
     }    

问题出在从SettingsFactory代码创建VB6 COM类并调用方法GetSettings(userName)时

代码语言:javascript
复制
settings = factory.GetSettings(userName);
key = settings.PrivateKey //<--- Exception occurs saying "Read write from protected memory is not allowed" or something like this.

当我在GetSettings方法中将设置实例保存在SettingsFactory的字段中时,这个问题就消失了,这样GC就不会收集它了。有人知道为什么会这样吗?我的意思是为什么GC要收集暴露给COM的对象?在调用GetSettings之后,RCW不是增加了设置对象上的ref编号吗?

EN

回答 1

Stack Overflow用户

发布于 2010-06-18 23:45:32

我认为问题在于privateData.Key没有被正确编组。我看不到键类型的定义,但我猜它是某种数据的ptr,并且该数据没有被正确编组。如果是这样的话,你可能需要使用一个Marhal.PtrToXXX函数。

如果您想了解有关从.net使用COM对象的更多信息,Runtime Callable Wrappers上的MSDN文章是一个很好的起点

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3071047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档