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 组件 - 使用和部署的主要内容,如果未能解决你的问题,请参考以下文章
用于多个应用程序中的 C# 类库的 SQL Server CE 私有部署
使用 C# 应用程序部署 SQL Server Compact