0

我正在创建使用 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 文件。我想在其他机器上使用我的应用程序,所以我必须做一些事情,但我不确定,是什么。我试图更改该引用的属性,包括复制本地,但我怀疑我必须在其他机器上安装这个 ocx 文件。我应该使用 regsvr32 还是 regasm?我应该注册这个 ocx 文件还是别的什么?

4

2 回答 2

1

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

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

于 2010-07-07T13:13:27.847 回答
0

Hans Passant 已经回答了我的问题,但我刚刚发现,Isolated在引用属性中设置True将完成这项工作 - exe、exe.manifest 和原始 ocx 文件将被放入发布文件夹,但这只有在我标记时才有效我的Main方法与[STAThread]属性:

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

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

于 2010-07-07T13:57:42.940 回答