【问题标题】:Com. C# create type of com-object康。 C#创建com-object类型
【发布时间】:2016-09-03 06:36:29
【问题描述】:

我正在开发一些使用 com 库的代码。我正在尝试通过

创建该类的实例
Type t = Activator.CreateInstance("TypeID"); 

但我无法得到它一直的类型 = null。 progid 已经浏览过 Ole / COM Wever,看来我确实输入正确。 可能有什么问题?

【问题讨论】:

    标签: c# com activator


    【解决方案1】:

    您是否传递了类型 ID 字符串?尝试先从 ProgId 获取类型对象:

    Type t = Type.GetTypeFromProgID(progID);
    object obj = Activator.CreateInstance(t);
    

    【讨论】:

    • 不。我这样使用它: Type t = Type.GetTypeFromProgID(progID);动态 obj = Activator.CreateInstance(t);它总是 t == null;
    • 那么T是null还是OBJ?
    • COM 库是否已在系统中注册,您确定您不在 64/32 位混合环境中(例如:应用程序是 64 位或“两者”且 COM 库是 32 位)
    • 是的,它已注册,我可以在没有 Ativator 的情况下使用其中的对象。但我需要使用 Activator 与他们合作。
    • 好吧,根据 MSDN,它 GetTypeFromProgID 返回“与指定 ProgID 关联的类型,如果 progID 是注册表中的有效条目并且类型与之关联;否则为 null。” (msdn.microsoft.com/en-us/library/hss5hw09.aspx)
    【解决方案2】:

    我想附加到 Strillo 的答案,但我没有添加评论所需的声誉。

    在我手动注册 COM dll 之前,我的行为与 shtpavel 相同。一旦我注册了 COM dll,Strillo 的回答就对我有用。

    regasm /tlb /codebase project.dll
    

    Regasm 可以在以下位置找到:

    C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/RegAsm.exe
    

    项目设置视图的 Build 选项卡,在 Output 标题下有一个“Register for COM interop”复选框。我已经向自己证明了这确实注册了 COM dll,但是在我使用上述命令手动注册 dll 之前,Strillo 的回答对我不起作用。

    RegAsm - When is the /codebase option applicable? 声明 Visual Studio 的“注册 COM 互操作”复选框与我的命令行解决方案相同。但我的经验是,最初“注册 COM 互操作”是不够的。不知道为什么。

    【讨论】:

      【解决方案3】:

      问题是 Activator 不能用于实例化 COM 对象那种方式编辑:我现在强调这一点,因为我从你的问题中了解到你是将 GUID 直接传递给Activator.CreateInstance)。

      通常您添加对已注册 COM 类的引用(通过“添加引用”对话框的“COM”选项卡)。然后,您可以像使用任何其他类一样使用 COM 类。

      或者你试试 Strillo 说的 :-)

      但是,按照我建议的方式进行操作具有仍然保持强类型的优势。

      【讨论】:

      • 我从 OPs 的问题中了解到他正在将 COM 类 GUID 传递给 Activator.CreateInstance - 这就是我写他不能那样使用它的原因。我并不是说Activator 不能用于创建COM 对象根本
      猜你喜欢
      • 2012-11-23
      • 1970-01-01
      • 2014-08-31
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      相关资源
      最近更新 更多