从 .Net Dll 创建 .Ocx 文件

Posted

技术标签:

【中文标题】从 .Net Dll 创建 .Ocx 文件【英文标题】:Creation of .Ocx File from a .Net Dll 【发布时间】:2011-05-30 11:09:40 【问题描述】:

我有一个 .Net Com Dll 是否可以使用这个 dll 并在 c++ 或 MFC 中创建 .OCX 文件。如果是,需要遵循的所有步骤是什么。如果有任何示例代码,那将是一个很大的帮助

【问题讨论】:

为什么需要.ocx(一般ActiveX组件不需要那个扩展)? 我有一个 .Net Dll,里面有 Form。我需要在我的 MFC 应用程序中使用这些表单,以便如何使用它。据我所知,OCX 是一种方式。 我相信您不需要.ocx,拥有 typelib(请参阅 Darin 的回答)就足够了(请记住,您需要在安装程序中为 .NET COM 组件正确注册 COM )。 【参考方案1】:

您可以使用regasm.exe 工具将 .NET 程序集公开为 COM 对象。您可以使用[ComVisible(true)] 来指示所有类在注册时应该对COM 客户端可见。此程序集级别属性也可以在 Visual Studio 中的项目属性中设置。您也可以将其仅应用于某些需要导出的类。一旦程序集注册为 COM 对象,您就可以像使用任何标准 COM 对象一样从非托管客户端实例化任何类。

【讨论】:

嗨 Darin Dimitrov,我是否应该使用 .TLB 文件来实例化我的 dll 嗨 Darin Dimitrov,是否可以通过您告诉的方法在我的 .net dll 中加载表单 @subbu,是的,因为表单只是普通类。 谢谢达林它工作。我有一个问题,在 MFC 中,当我将此控件的可见性设置为 Hidden 时。应用程序正在崩溃,对此有任何想法。【参考方案2】:

.ocx 文件没有什么特别之处,它只是一个 DLL。 Microsoft 早在 4 天前就在 Visual Basic 版本中提出了该文件扩展名,以使 VB 程序员清楚他们有一个包含控件的 DLL。 ActiveX 控件与 16 位时代的 VBX 控件不同。

如果您制作了 .NET 程序集 [ComVisible],那么您已经拥有一个可用于其他项目的 COM 服务器。如果您正确注册,.NET 程序集必须注册到 Regasm.exe 而不是 Regsvr32.exe。使用 Project + Properties、Build 选项卡、“Register for COM interop”选项在 .NET 项目中自动完成。并在安装时使用设置和部署项目。如果您需要类型库,请使用带有 /tlb 和 /codebase 选项的 Regasm.exe。或者 Tlbexp.exe

如果这确实需要一个传统的 .ocx,换句话说,有控件,那么您可以使用 Winforms UserControl 或您自己的从 Winforms 控件派生的类。 Winforms 自动实现管道以使从 Control 类派生的类在 ActiveX 主机中正常运行。

【讨论】:

【参考方案3】:

如果您想在普通 C++ 中使用 .NET 库,有很多方法,主要涉及 COM 互操作。 Microsoft 有一整段 MDSN 专用于 COM 互操作:http://msdn.microsoft.com/en-us/library/6bw51z5z%28v=VS.71%29.aspx。

    如果 .NET DLL 支持 COM 互操作,请使用它。 尝试使用 VC++ 的 #import 指令将 .NET DLL 作为 COM 对象读取。编译后,VC++ 应该输出一个 .tlh 文件和一个 .thi 文件(分别是头文件和实现),它们将自动编译到您的项目中。但这可能会或可能不会起作用,具体取决于 DLL 的构造、依赖项等。 考虑创建您自己的 COM 互操作 .NET 包装库,用于编组对基本 .NET DLL 的调用。

【讨论】:

以上是关于从 .Net Dll 创建 .Ocx 文件的主要内容,如果未能解决你的问题,请参考以下文章

在 vb.net 中使用 vb6 ocx 控件时无法加载文件或程序集“Interop.VBRUN”

OCX和DLL的区别

如何处理与 .NET WPF 应用程序具有 OCX 依赖项的 VB6 ActiveX dll 的对话

delphi中调用.OCX怎样进行的?万分感谢!

ocx控件加载失败

如何在 .NET (C#) 中使用 AutoItX 而无需注册