【问题标题】:Create COM object from .NET COM method从 .NET COM 方法创建 COM 对象
【发布时间】: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 数吗?

【问题讨论】:

    标签: c# com


    【解决方案1】:

    我认为问题在于 privateData.Key 没有正确编组。我看不到 Key 类型的定义,但我的猜测是它是某种数据的指针,并且这些数据没有被正确编组。如果是这种情况,您可能需要使用 Marhal.PtrToXXX 函数之一。

    如果您想了解更多关于在 .net 中使用 COM 对象的信息,可以从 Runtime Callable Wrappers 上的 MSDN 文章开始

    【讨论】:

      猜你喜欢
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 2017-10-30
      • 2011-09-10
      相关资源
      最近更新 更多