代码之家  ›  专栏  ›  技术社区  ›  prostynick

C#中OCX组件的使用与部署

  •  0
  • prostynick  · 技术社区  · 15 年前

    我正在创建使用OCX组件的C应用程序。我从某种打印机制造商那里得到了这个部件。在安装他们的文件时,foo.ocx被添加到了我的C:\Windows\System32中。

    我唯一要做的就是在解决方案资源管理器中添加引用,并在COM选项卡中指向该库。然后我采取了界面:

    [Guid("XXX")]
     [CoClass(typeof(FooClass))]
     public interface Foo : IFoo { }
    

    我创建了COM接口的实例:

     class Program
     {
      static void Main(string[] args)
      {
       var foo = new Foo();
      }
     }
    

    一切正常。我做得对吗?

    第二件事 对我来说更重要 我不知道如何部署它。解决方案资源管理器中引用的文件具有以下属性:嵌入互操作类型:True,隔离:False。这将导致生成目录中只有1个exe文件。我想在其他机器上使用我的应用程序,所以我必须做一些事情,但我不确定,什么。我试图更改该引用的属性,包括copy local,但我怀疑必须在其他计算机上安装此ocx文件。我应该使用regsvr32还是regasm?我应该注册这个ocx文件还是别的什么?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Hans Passant    15 年前

    使用[CoClass]属性是非常不寻常的,您通常依赖Tlbimp.exe或添加COM引用来自动将类型库转换为互操作类。避免错误和版本控制问题。但如果成功了,那又怎么样。

    是的,您需要在目标计算机上部署并安装COM服务器。只需复制.ocx文件并将其注册到Regsvr32.exe即可。但是很少有这么简单的.ocx文件可能依赖于其他DLL,这些DLL也需要复制和/或注册。最好使用供应商的安装程序。找出一个原始测试机器或虚拟机需要什么。

        2
  •  0
  •   prostynick    15 年前

    Isolated 将属性引用到 True 将做的工作-exe,exe.manifest和原始的ocx文件将放在释放文件夹,但这将只工作,如果我标记我的 Main [STAThread] 属性:

    class Program
    {
     [STAThread]
     static void Main(string[] args)
     {
      var foo = new Foo();
     }
    }
    

    没有这个运行exe将导致 InvalidCastException . 在那之后,我真的不需要用regsvr32注册ocx。

    推荐文章