C# 中的 OCX 组件 - 使用和部署

Posted

技术标签:

【中文标题】C# 中的 OCX 组件 - 使用和部署【英文标题】:OCX component in C# - using and deploying 【发布时间】:2010-07-07 10:32:12 【问题描述】:

我正在创建使用 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文件还是别的什么?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我粘贴的界面是添加COM引用后生成的。我唯一要做的就是创建对象并使用它,如Program 类所示。 哦,好的。然后只需担心如何部署它。 你觉得我的回答怎么样? 在使用 COM 时,99.9% 的情况下都需要使用 [STAThread] 属性。绝大多数 COM 服务器只支持单线程单元。不知道为什么使用无注册 COM 有效果。【参考方案2】:

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

class Program

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

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

【讨论】:

以上是关于C# 中的 OCX 组件 - 使用和部署的主要内容,如果未能解决你的问题,请参考以下文章

部署应用程序(vs2005)

用于多个应用程序中的 C# 类库的 SQL Server CE 私有部署

使用 C# 应用程序部署 SQL Server Compact

如何在 Visual Studio、C# 项目的部署中包含文件和文件夹?

c#如何在winform中打开一个excel文档呢

JavaFX 可以调用和嵌入 OCX 组件吗