问题标签 [registration-free-com]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
232 浏览

c# - 免注册 COM 互操作初始化 - 无参数构造函数

我需要编写一个免费注册的 COM 互操作库,请参阅 MSDN 链接

要求之一是,我引用

“要使基于 .NET 的类与来自 COM 的无注册表激活兼容,该类必须具有默认构造函数并且必须是公共的。”

当我阅读它时,我需要创建以下内容......(这在技术上有效,我通过 COM 实例化它没有问题)

我正在寻找确保在调用任何方法之前(通过接口)初始化此类的最佳方法,因此,除了构造函数之外,我初始化“x”的下一个最佳选择是什么?据我所知,用参数重载构造函数不是一个选项 - 通常我会使用带参数的构造函数初始化这个类,但是使用无注册 COM,我没有那个选项(或者我没有? )。

我认为我的替代方案是“初始化”功能,例如...

我觉得这很混乱,但可行......但我错过了什么更好的选择?

0 投票
0 回答
628 浏览

delphi - 免费注册 com delphi

所以我有一个我想与 com 一起使用的 dll。它是用 c# 制作的,我想在 delphi 中使用 dll。我的用户非常受限,以至于注册 dll 可能会很痛苦。而且我被告知存在诸如免费注册之类的东西,所以我尝试了这就是我所做的:

在delphi中为我的exe创建一个清单文件,里面有:

我在 Project > options > application > manifest > custom > 中添加了这个清单,指向我的文件路径。

我的 c# dll 称为 Calc.dll(它只是一个计算器示例的测试 dll)。

然后我在我的delphi项目中添加了一个rc文件,右键单击exe(在ide中)添加> rc,里面有这个:

我调用了我的项目的清单文件:Project2.exe.manifest

然后我为我的 dll 创建了清单

称之为 Calc.X.manifest。

我使用 sxsTrace 解决了我遇到的问题(并排比较错误或类似的东西,基本上版本不匹配,它不会启动 exe,但现在它已修复)。

然后注销我的dll(我首先注册以测试它是否有效)。并启动了 exe,但现在我收到该类未注册的消息。它给了我 GUID 键,我确保它与我的清单中的相同。

这就是我现在的位置。我无法让我的应用使用清单中定义的 dll。

编辑

我将此添加到清单中:

这是我在 c# dll 中的类。我也尝试以相同的方式定义接口(ICalculator)。现在我在我的 delphi 应用程序中收到另一条消息:

EOleSysError:DLL 中的错误,ClassID:{96D7B70E-A084-4EE5-9FDE-AEEDB0C61B9B}

0 投票
0 回答
198 浏览

.net - 从 Java 应用程序中的非托管本机 C++ 库加载未注册的 .NET 程序集

我正在使用一个 Java 应用程序,该应用程序可以使用可能包含本机代码的自定义包进行扩展,因此除了添加扩展 jar 的能力之外,我无法控制 Java 环境。

在这种情况下,我需要能够从 Java 扩展调用 C# 代码。这是以前使用无注册 COM 从纯本机上下文中使用的 C# 代码 - 工作正常。现在我需要能够从这个 Java 上下文中使用相同的代码,但遇到了似乎无法控制应该在哪里找到 DLL 的问题。要求将 DLL 安装到 JRE/JDK bin 目录中显然不是一种选择,并且要求将 DLL 注册到 GAC 中也不理想。

目前我希望将所有 DLL 依赖项打包到扩展 jar 中,并在运行时需要时加载(无需手动安装步骤)。

我希望我可以使用 Activation Context API 来使其正常工作,并测试了此代码的许多变体,DLL 位于D:\somepath\

清单包含一个dependentAssembly,其中包含程序集的详细信息,其中包含对CoCreateInstance的调用引用的 C# 类。

还尝试了使用 mt.exe 从 DLL 转储的这种格式的清单:

CreateActCtxActivateActCtx调用成功,但CoCreateInstance调用总是失败,返回 0x80070002,除非我将 DLL 放在C:\Program Files\Java...

是否有任何解决方案(除了使用 GAC)允许完全非托管的 C++ DLL 从任意已知位置的 DLL 加载和创建 C# 类的实例?

0 投票
1 回答
196 浏览

delphi - 具有相同类型库 (SxS) 的多个版本的免注册 COM/DLL

在下面的问题中,有一个关于如何让 Delphi 以免注册方式使用 ActiveX 控件的非常好的说明。

免注册 COM/DLL?

但我还有一个问题——这也可以用来支持同一个 COM 对象的多个版本作为独立对象吗?我认为 .NET 可以,但我们在 Win32 应用程序中需要它。

原因是我们使用了第三方组件,它只有一个接口(GUID),但根据 dll 的版本有不同的行为(计算)。

0 投票
1 回答
256 浏览

c++ - 使用免注册 COM 时 Powershell 无法使用 COM 对象

我正在尝试在 powershell 中以无注册方式使用 COM 对象。我的组件是 x86,poweshell_ise.exe 也是 x86。

为此,我为基于 dll 的 com 服务器创建了清单:

并为 powershell 脚本清单:

在 powershell 中,我通过以下方式使用它:

之后,我收到以下错误:

我可以看到它ComComponent.dll已加载到powershell_ise.exeProcess Explorer 中。此外,我可以看到 powershell 出于某种原因正在尝试读取HKCR\TypeLib\{<TLB_CLSID>}注册表项。

相同的功能在具有注册 COM 的 powershell 中工作。我试图将类型库放入具有相同结果的单独文件中。

可能是什么问题?谢谢

0 投票
0 回答
232 浏览

sql-server-data-tools - 如何在不安装任何工具的情况下从命令行生成 ISPAC 文件

我有一个请求,将生成 ISPAC 文件的过程作为我们自动构建系统的一部分自动化(目前这是在开发人员机器上手动完成的)。构建系统的配置方式所有工具都驻留在源代码控制中,构建机器上没有安装任何东西。启动构建时,脚本将环境配置为使用源代码控制存储库中的路径来运行工具。在我的开发机器上,我安装了 SSDT,但我需要避免安装任何东西。我看过这篇文章其中讨论了如何通过 MSBuild 从命令行生成 ISPAC 文件,并引用了 CodePlex 上的一个项目,但该项目仍然需要安装 SSDT 才能工作。我已经联系了这篇文章的作者,看看他是否有任何建议,但我想我也会在这里尝试,因为它的受众如此之多。

从项目构建工具并确定工具的依赖关系并将适当的 DLL 拉到与工具相同的文件夹后,运行时出现以下错误:

在堆栈跟踪之后,它看起来像 DTS.dll 让我感到困惑,即使它与该工具位于同一文件夹中。有人向我提到将免注册 COM 互操作作为一种可能的解决方案。我已经为 DTS.dll 生成了一个清单文件,也为该工具生成了一个清单文件,但仍然没有区别。我不知道这是否是完成我需要的错误路径,或者我只是做错了。任何帮助将不胜感激。

0 投票
0 回答
84 浏览

com - mt.exe -replacements:未记录免注册 COM 组件的 xml 文件结构

我正在使用mt.exe为无注册表的 C++ COM 组件生成清单。命令行上传递的 .rgs 文件有一些可替换的字符串,其值必须存储在传递给-replacements参数的 .xml 文件中。问题是,没有关于该 xml 文件的预期语法的文档。我向 Microsoft 报告了该问题,但未提供任何解决方案,该票已关闭。有谁知道替换 xml 文件的结构应该如何?

0 投票
1 回答
163 浏览

c++ - 无注册 COM 进程外 EXE

我有几个组件(多个 .dll,一个 .exe)需要免费注册才能使用。在我的 sxs 清单中,我将 dll 文件列为;

我已经创建并激活了一个激活上下文,并且可以CoCreateInstance();毫无问题地调用这些 dll 组件。

但是,我还有一个需要运行的 COM 服务器单例(作为 .exe),我相信您只能将 dll 文件放在 sxs 清单中。我有它的 CLSID。

我受到限制,因为使用 regsvr 不是一个选项,所以有没有其他方法可以实现这一点?理想情况下,以编程方式在与我创建这些其他组件的位置相同的位置完成所有操作。

0 投票
0 回答
53 浏览

.net - 为什么 .NET COM 事件在引发时会抛出“对象与目标类型不匹配”?

TL;DR:在大多数情况下都有效的 COM 事件,抛出一个System.Reflection.TargetExceptionwhen

  1. 使用免注册 SxS 部署 COM 服务器
  2. 该事件由 WCF 服务主机引发

我们正在使用复杂的架构来现代化一套已有 30 多年历史的企业应用程序。多年来,我们一直在使用 WCF 在我们的几个应用程序中触发 COM 事件。这使我们能够访问旧应用程序中的数据和业务流程,并将该数据公开给任何使用 WCF 客户端的现代应用程序。我们通过构建公开事件供应用订阅的 COM 服务器和一个 COM 方法来实现这一点,该方法在调用时会创建一个 WCF 服务主机,该主机会在收到消息请求时触发这些事件。我们最近更新了我们的一个遗留应用程序——一个旧的 Windows 桌面应用程序,它为我们的系统核心提供主要用户界面,并为我们的系统提供大部分业务操作。它可以在“无声”中运行 模式允许它类似于原始 NT 服务使用。它可以执行后台操作以及发送给它的服务请求。我们最近构建了一个 .NET COM 服务器,它可以为这个遗留应用程序提供一些现代 WPF 窗口。这是我们第一次尝试从基于 GDI 的旧应用程序中公开 WPF 窗口。我提到这一点是因为 COM 服务器可以在从服务器提供的 WPF 组件触发时引发事件。同样的 COM 服务器也可以维护一个 WCF 服务主机,它会引发与 WPF UI 相同的 COM 事件,以支持旧版应用程序的“静默”模式 - 当应用程序在没有 UI 的情况下运行时。所有这些都有效,并且已经毫无问题地部署到生产环境中。我们最近构建了一个 .NET COM 服务器,它可以为这个遗留应用程序提供一些现代 WPF 窗口。这是我们第一次尝试从基于 GDI 的旧应用程序中公开 WPF 窗口。我提到这一点是因为 COM 服务器可以在从服务器提供的 WPF 组件触发时引发事件。同样的 COM 服务器也可以维护一个 WCF 服务主机,它会引发与 WPF UI 相同的 COM 事件,以支持旧版应用程序的“静默”模式 - 当应用程序在没有 UI 的情况下运行时。所有这些都有效,并且已经毫无问题地部署到生产环境中。我们最近构建了一个 .NET COM 服务器,它可以为这个遗留应用程序提供一些现代 WPF 窗口。这是我们第一次尝试从基于 GDI 的旧应用程序中公开 WPF 窗口。我提到这一点是因为 COM 服务器可以在从服务器提供的 WPF 组件触发时引发事件。同样的 COM 服务器也可以维护一个 WCF 服务主机,它会引发与 WPF UI 相同的 COM 事件,以支持旧版应用程序的“静默”模式 - 当应用程序在没有 UI 的情况下运行时。所有这些都有效,并且已经毫无问题地部署到生产环境中。同样的 COM 服务器也可以维护一个 WCF 服务主机,它会引发与 WPF UI 相同的 COM 事件,以支持旧版应用程序的“静默”模式 - 当应用程序在没有 UI 的情况下运行时。所有这些都有效,并且已经毫无问题地部署到生产环境中。同样的 COM 服务器也可以维护一个 WCF 服务主机,它会引发与 WPF UI 相同的 COM 事件,以支持旧版应用程序的“静默”模式 - 当应用程序在没有 UI 的情况下运行时。所有这些都有效,并且已经毫无问题地部署到生产环境中。

但是,我最近开始为这个特定的 COM 服务器探索免注册 COM。在某种程度上,我已经出人意料地成功了。当 UI 运行时,WPF 组件都可以正常工作,并且这些 COM 事件由旧版应用程序成功处理。当应用程序在静默模式下运行时,客户端应用程序成功实例化和配置 COM 服务器,并成功绑定到 COM 事件。COM 服务器成功初始化 WCF 服务主机。但是,当主机收到消息并尝试引发其中一个事件时,会在引发事件之前引发此异常。客户永远不会收到该事件的通知。澄清一下,我在这里关注的特定事件在 COM 服务器的 WPF 组件触发它时成功引发和处理,但不是在 COM'

对象与目标类型不匹配。
(System.Reflection.TargetException)

来源:mscorlib 目标站点:InvokeDispMethod 声明类型:System.RuntimeType

堆栈跟踪: - - - - - - - - - - - - - - - - - - - - - - - - ---- 在 System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32culture, String[] namedParameters) 在 System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags , Binder binder, Object target, Object[] providedArgs, ParameterModifier[] 修饰符, CultureInfoculture, String[] namedParams) at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData) at MyApp.IMyCOMServer.RetrieveProcesses()
在 MyApp.MyCOMServer.OnRetrieveProcesses() 在 MyApp.MyService.d__7.MoveNext()

WPF 组件和 WCF 组件之间的一个重要区别是线程。旧版应用程序是单线程公寓应用程序,因此所有 WPF 事件都由应用程序的 UI 线程抽取和处理。这是我期望失败的地方,因为这不是一件容易完成的任务,而且对我们来说是非常新的架构。但是,当应用程序在没有 UI 的情况下运行时,WCF 服务会在新线程上处理每条消息。旧版应用程序是用 Visual FoxPro 编写的,它支持 COM 自动化服务器并为我们处理有关 COM 事件和线程问题的所有混乱。20 多年来,我们一直在我们的 VFP 应用程序中广泛使用 COM 事件,并且在该领域拥有丰富的经验,所以这是我认为问题最少的地方。线程对于我们的 WCF 服务主机来说从来都不是问题,但我来了。

这是 COM 服务器接口的相关部分。COM 客户端实例化 COM 服务器,然后订阅上面定义的 IMyCOMEvents 公开的事件,最后调用下面定义的 StartWcfService。客户端然后空闲,侦听要处理的事件。

这是 COM 服务器的相关部分。当抛出异常时,RetrieveProcesses 事件不为空 - 看起来 COM 客户端已成功订阅。ProcessList 是一个类似 POCO 的 COM 服务器,期望 COM 客户端实例化并返回它,尽管我也尝试重构事件定义以便客户端返回 a System.String,但抛出相同的异常。ProcessList 还支持使用 的序列化System.Runtime.Serialization.DataContractSerializer,当我进一步了解时,这与 WCF 服务相关。

这是 WCF 服务实例的相关部分。该服务返回一个任务,主要是为了支持我们的 WCF 客户端,它们是异步的。

下面是相关的 COM 客户端代码,它是用 Visual FoxPro 编写的。

0 投票
0 回答
94 浏览

python - 创建一个免注册的 python COM 组件

我一直在尝试理解 COM 库,但我仍然感到困惑。如果我想让一个 python 对象 com 可见,我能找到的唯一说明是制作一个 python 脚本来设置一个 COM 服务器,该服务器被调用并用于按名称生成类实例。IIUC,这是通过将一些信息永久添加到将 CLSID 链接到我的server.py文件路径的注册表中来实现的;这是一个最小的例子:

像这样调用:

但是我确信过去我已经下载了一些 file.dll,我可以将其添加为对我的 COM 客户端项目 (VBA) 的引用,并且我从不调用 --register/regsrvr/etc。我假设 dll 包含在运行时修改和恢复对注册表的更改所需的所有信息。我可以使用 Early 或 Late 绑定来创建类实例。如果引用的 dll 包含类型库,我什至会得到智能感知。

后一种方法感觉更简单,更便携。有没有办法在python中模拟这个?