假设我们有一个现有进程(或应用程序)从 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(即,没有图形用户界面),第二个可以用来在表单上绘制,就像您通常使用任何其他控件一样 TextBox
或 Label
。
要使用它,请转到 Visual Studio,右键单击您的项目并选择“添加引用”。浏览到新创建的 DLL 并添加它。就这样。
关于C# - Hook 到现有的 COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1563051/