C# - Hook 到现有的 COM 对象

标签 c# .net com interop hook

假设我们有一个现有进程(或应用程序)从 ocx 文件(如“MyCOMLibrary.ocx”)调用 COM 对象。

有没有办法编写一个 C# 库来精确复制 ocx 文件?以便原始应用程序可以调用您的 C# 代码而不是原始 COM 对象?

当然,您必须使用与原始 ocx 相同的 CLSID 和 ProgID。并假设不涉及签名,例如 .Net 世界中的 SNK。

此外,是否有任何工具可以自动执行此操作?接收 ocx 并吐出包含要实现方法的 C# 文件的东西。

编辑:我想补充一点,原来的应用程序是 VB6,根本不使用 .Net。他们很可能像 VB6 应用程序一样加载 ocx(ProgId 或 Guid)。这会导致任何问题吗?

我们完全重写 ocx 也没有问题——我们很可能只返回所有方法的成功错误代码,并且只使用我们的情况所需的方法/事件。

编辑:您会认为这不会太难完成。我们能否制作一个可以替换旧 ocx 的 VB6 ocx 文件,并将所有调用传递给 .Net 程序集?

编辑:我尝试使用以下开源库:EasyHook

但看起来这个问题应该还是可行的。 VB6 似乎以防止 Hook 的方式加载 COM 对象。我没有看到使用 EasyHook Hook 类/接口(interface)或类的构造函数上的实例方法的方法。

最佳答案

您可以使用 ActiveX Import AxImp 导入 OCX,创建包装类,然后调用它。该程序在此处描述:http://msdn.microsoft.com/en-us/library/8ccdh774(VS.80).aspx 基本上,您需要做的是在命令提示符下执行以下命令:

c:/>AxImp MyControl.ocx

结果是一个 MyControl.dll 和一个 AxMyControl.dll。第一个可以在您的项目中用作普通的 .NET DLL(即,没有图形用户界面),第二个可以用来在表单上绘制,就像您通常使用任何其他控件一样 TextBoxLabel

要使用它,请转到 Visual Studio,右键单击您的项目并选择“添加引用”。浏览到新创建的 DLL 并添加它。就这样。

关于C# - Hook 到现有的 COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1563051/

相关文章:

.net - 有没有一种简单的方法可以将 Delphi 2009 中的 Win32 应用程序移植到 .NET?

c# - .NET 框架先决条件

c# - 解决循环引用 (C#)

c# - 在 MTM 测试运行中获取当前内部版本号/环境设置

c# - MVC 应用程序中的授权和身份验证

c# - 在传递给非托管代码之前固定一个可更新的结构?

c++ - 如何为虚函数设置对齐方式?

c# - Tlbimp 无法生成互操作 Dll

javascript - 在 Firefox 或 Chrome 中运行 COM 对象

c# - 任何好的 C# SIP 库?