问题标签 [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 投票
1 回答
116 浏览

.net - 为什么加载程序在注册表中查找我的免注册 COM 组件?

我已经成功地使用免注册 COM 将 COM 组件加载到我的 .Net 进程中。突然有些事情发生了变化(当我出去吃午饭时,似乎:-))并且加载过程停止了工作。

而在我的 COM 组件正确加载之前,现在我得到了 FileNotFoundException。

运行ProcMon来探索是怎么回事,我发现加载器正在注册表中查找 CLSID,并发现组件已经注册。然后它查看注册的路径,发现 dll 不存在。

谁能告诉我,当我使用免注册 COM 配置加载程序时,为什么加载程序会去注册表查找组件?我假设清单优先于注册表,但我找不到任何关于此的文档。

0 投票
1 回答
3369 浏览

com - 免费注册 COM、线程模型、MT.exe 和 *.RGS 脚本

我有一个免注册的 C++ COM 组件,我使用 VS2010 使用 mt.exe 生成其清单。一切正常,除了我无法指定我的类使用的线程模型。我创建了一个小型 repro 项目,其生成的清单文件 ( RGS.dll.embed.manifest) 如下:

我遇到问题的部分是 comClass 节点

应该有一个 threadingModel 属性,如以下页面的“Sxs 和注册免费 COM 激活”示例:http: //blogs.msdn.com/b/junfeng/archive/2006/04/20/579748.aspx

我知道线程模型未在 中指定*.tlb,但根据 Sen Harada 对 MSDN 文档的评论mt.exe,您应该能够在注册脚本文件 ( *.rgs) http://msdn.microsoft.com/en-us中指定一个/library/windows/desktop/aa375649(v=vs.85).aspx

所以我有*.rgsATL 向导创建的文件

所以我把*.rgs文件给mt.exe

并且从构建日志中看到已经成功解析了*.rgs文件

(特别是“有效 GUID !!!”行没有rgs:参数 to mt.exe

然而我RGS.dll.embed.manifest没有 threadingModel 属性。

这个人是我能在网上找到的唯一一个谈论这个问题的人,http://social.msdn.microsoft.com/Forums/en-US/vcmfcatl/thread/dbab28cd-023f-45b1-be62-7dc71e8d3d9f,他从来没有找到了解决方案并在生成清单后对其进行了编辑。有谁知道 mt.exe 工具如何使用 RGS 文件创建清单,以及我需要做什么才能从另一端获取 threadingModel?

0 投票
1 回答
2223 浏览

.net - 无法从 VBA 获得免注册 COM

更新:花了 20 多个小时试图让一个简单的示例正常工作后,我意识到这并不像看起来那么简单。像这样的文章揭示了“陷阱”——这是在 Windows 7 之前编写的(它以不同的方式处理清单)。我坚持通过 VSTO将 .NET 程序集公开给 VBA 。


我制作了一个简单的 COM-Visible .NET 程序集,并试图从 Excel VBA 中调用它。如果我在 .NET 构建期间“注册 COM 互操作”,我可以成功地从 VBA 调用它。

但是,我想做免注册。

根据汉斯的建议更新:

我取消选中 Register for COM Interop,并将我的 app.Manifest 设置为:

我创建了一个像这样的虚拟“client.manifest”:

在创建对象时,我修改了我的 VBA 以使用 client.manifest:

它在 CreateObject 上失败,并带有不太有用的错误Method 'CreateObject' of object 'IActCtx' failed

sxstrace 显示它读取 client.manifest 并创建 Activation Context。进程监视器显示它访问 ComTest.dll 并在注册表中搜索类 975DC7E0-4596-4C42-9D0C-0601F86E3A1B。

我错过了什么?


这是.NET代码:

我正在运行 64 位 Windows 7。

0 投票
1 回答
140 浏览

com - SilverLight 组件能否实例化免注册的 COM 可见 .NET 对象

我们正在尝试使用激活上下文 API 在 IE 中运行的 SilverLight 5.0 组件中加载一个 COM 可见的 .NET 对象,而无需注册。 http://msdn.microsoft.com/en-us/library/ms973913.aspx

SilverLight 组件在浏览器中作为受信任的应用程序运行,如http://msdn.microsoft.com/en-us/library/gg192793(v=vs.95).aspx中所述。

可以使用激活上下文 API 将对象加载到独立的测试应用程序中,以便正确形成清单。在浏览器内运行的 SiverLight 中,组件加载器 DLL(从 AppData/LocalLow 加载)成功创建并激活了激活上下文,但无法从 AppData/LocalLow 加载 COM 可见的 .NET 对象 DLL。结果总是“找不到文件”。

有没有人在类似设置中使用 SilverLight/COM 的经验?

TIA

0 投票
1 回答
898 浏览

.net - SXS 如何选择应该加载哪个框架版本?

我目前正在努力让 .NET 程序集(带有 COM 类)免费注册。它运作良好,但是我有一个问题,我似乎无法确定确切的原因。

我的问题是,程序集绑定没有在正确的 .NET Framework 版本上完成。

我目前有 2 个程序集(我们称它们为 A.dll 和 B.dll),它们都是使用 .NET 4.0 构建的。

B.dll很小,我做了它来测试免注册激活。它旁边有一个清单,B.dll.manifest)。它包含 1 个具有 1 个属性和 1 个方法的类。

A.dll 要复杂得多,经过签名,它的清单作为构建后事件的资源嵌入(使用 mt.exe)。

我制作了一个 VB6 应用程序来测试它们。我的应用程序有一个清单,它声明了依赖项。

如果我运行我的应用程序,B.dll 运行良好,但 A.dll 没有。使用 fuslogvw.exe 查看绑定日志,我发现 A.dll 的绑定是使用 .NET 2.0 尝试的,而 B.dll 是使用 .NET 4.0 完成的。

A.dll 最终失败,错误代码为 0x8013101b,即 COR_E_NEWER_RUNTIME。ERR:从文件中提取清单导入时出错(hr = 0x8013101b)。

为了让它工作,我必须用这个内容向我的 VB6 应用程序添加一个 .config 文件

然后,它绑定到正确的框架版本并且可以工作。

我认为,MT.exe 可能更改了我的程序集中的属性/元信息,使其认为应该加载 2.0。所以我使用 ILSpy 打开它。我在那里看到的一切都在谈论 4.0,没有任何可疑之处。

我已经读过默认情况下应该使用用于构建 em 的固件加载程序集(在我的情况下,它们都是 4.0,任何地方都没有 2.0)。所以,我不明白为什么它会尝试使用 2.0 加载那个特定的。

这对我来说是一个问题,因为我想避免创建/维护,但最重要的是为所有将使用此特定程序集的应用程序部署这些 .config。在我的特殊情况下,这意味着大约有 100 个 .config 文件。

以供参考:

我使用的 MT.exe 来自 7.0A SDK,版本为 5.2.3790.2076。

这是 fuslogvw.exe 输出(对不起法语和混乱的重音字符,重要的部分是框架版本号)

B、工作

A、不工作

A,工作(感谢配置文件)

0 投票
2 回答
2085 浏览

com - 如何从 C# 等托管代码中为 ActiveX 组件使用嵌入式免注册清单?

我想使用未在系统范围或用户范围内注册的特定版本的 ActiveX 组件。如果我使用清单文件,一切都会按预期工作。但是嵌入式清单仅适用于 C++ 客户端代码。

这是依赖声明

如果我使用 SxStrace,我会看到以下内容

所以显然它无论如何都只想要DLL。问题是我从 AxImp 获得的 DLL 没有嵌入式清单。有没有使用嵌入式清单的好方法?我觉得我可以尝试让 mt 将一个嵌入到我从 AxImp 获得的 DLL 中,但这似乎很老套。

PS 我不确定将 ocx 重命名为 dll 是否是一种好方法,因为 AxImp 也会为 COM 内容生成同名 DLL,而且看起来没有标志可以为 COM CLR 代理显式提供输出名称。

0 投票
1 回答
1347 浏览

c# - C#项目添加引用-基于配置的动态路径?

我的一个 C# 项目需要在构建另一个项目后引用使用 tlbimp.exe 手动创建(构建后事件)的 .dll。原因是我选择弃用 DLL 注册,因为我们的开发计算机不再具有注册 DLL 的权限。

所以现在我有两种解决方案配置,一种是RELEASE,另一种是DEBUG。从两者生成的 DLL 是不同的。如何添加引用,以便将它们动态引用到相应的构建文件夹 /RELEASE/AVClib.dll 和 /DEBUG /AVClib.dll。

我不想将它们复制到其他地方并引用单个位置,因为我预计经常在项目配置之间来回切换并且不想每次都重新构建。

我对项目的配置比较陌生,所以如果我错误地处理了这个问题,请指教!

0 投票
2 回答
456 浏览

c++ - 我们如何在不注册 dll 的情况下对我们的 c++ COM 代码进行单元测试?

我们正在尝试将单元测试添加到遗留的 c++ COM 应用程序中。我们还需要我们的构建机器能够运行单元测试,以确保每个构建都没有引入错误。但是,我们不希望构建机器必须注册 com dll,以便一台构建机器可以并行构建多个版本。我们假设我们可以更改为使用带有清单文件的免注册 com,但我很难让它发挥作用。还没有在我们的代码库上,而只是在 Microsoft 提供的基本示例上。
我一直在使用这个页面http://msdn.microsoft.com/en-us/library/ms973913.aspx#rfacomwalk_topic8 当我尝试使用未注册的 dll 运行以使用清单文件时,它根本不起作用,我得到“类未注册错误”

他们提供的示例工作正常(使用 c++ com 服务器和 c++ 客户端),但是当我重建它们时它们不起作用。

我们使用的是 Visual Studio 2013,因此在我看来,免费注册 com 的工作方式发生了很大变化,这使得本教程与较新的编译器不兼容。

谁能指出我在最新版本的 Visual Studio 中使用免费注册 com 的资源?当我到达那里时,为了使我们自己的应用程序中的事情进一步复杂化,我们使用的是 VS 2013,但针对的是 2010 编译器,希望这不会有太大的不同。

此外,如果有比清单文件更好的方法在 com 组件上运行 c++ 单元测试而不注册,我也想听听这些。

谢谢你的帮助。

0 投票
0 回答
123 浏览

vb6 - Reg Free COM Interop 在 XP 下不起作用

我们正在使用我们公司的一个主要软件,它是用 VB6 编写的,并且太大而无法迁移。此外,我们还有一些仍在使用的旧 Windows XP PC(没有争议,这不是我的决定)。我们想通过使用 VB.NET 程序集向我们的 VB6 程序添加新功能。这对于 Win Vista 及更高版本运行良好,但 XP 的行为不正常。

我尝试过的:我在 VB .NET 中创建了一个类库。使其成为 COM-Visible 并将其注册为 com-interop。我的目标是 .NET Framework 4.0(也试过 2.0)然后我创建了一个带有简单函数的简单类,用于测试目的:

我已经为 X86 编译了它。

然后我在 VB6 中添加了对它的引用,并在 VB6 中使用了这个简单的代码

然后我创建了一个清单并将其嵌入: mt.exe -managedassemblyname:testDLL.dll -nodependency -out:testDLL.manifest mt.exe -manifest testDLL.manifest -outputresource:testDLL.dll;#1

然后,我为 exe 创建了一个清单,其中仅包含最基本的必要信息(Type="win32"、名称、版本、处理器架构和一个带有名称、处理器架构和版本的程序集块)和一个带有 (我的 Framework 2.0 dll 遇到了同样的错误,所以这应该无关紧要)

当我在高于 XP 的任何环境中执行我的 VB6 exe 时,一切正常。当我在 XP 上尝试时,出现运行时错误“429”Activex 组件无法创建对象

奇怪的是,我有一个更复杂的 dll 以完全相同的方式创建,只是具有更多功能,使用报表查看器和 sql。然而这个复杂的 dll 工作正常。我能找到的唯一相关区别是它使用 WinForm 作为类。不知道为什么这会有所作为,但正如我所说,声明接口和类、创建清单和诸如此类的方式都是相同的。

我不知道该怎么办了。我不知道是什么让那个单一的 DLL 工作而其他一切都没有。

0 投票
2 回答
2127 浏览

c# - 在免注册(并排)COM 中从 .Net COM dll 回调到 Delphi 客户端

TLDR:我正在尝试将异步回调从 .Net COM dll 调用到 Delphi 客户端 .exe,但这些似乎在免注册 COM 中无法正常工作,而同步回调确实有效,并且异步回调在它运行时也在工作不是无注册的 COM。


我的全球案例是我有一个公开一些公共事件的外国闭源 .Net dll。我需要将这些事件传递给 Delphi 应用程序。所以我决定制作一个中间 .dll,作为我的应用程序和另一个 dll 之间的 COM 桥梁。当我的 dll 通过 regasm 注册时它工作得很好,但是当我切换到无注册 COM 时情况变得更糟。我将我的案例缩短为不依赖于其他 dll 的小型可重现示例,因此我将在下面发布。

基于这个答案ICallbackHandler,我制作了一个我希望从 Delphi 客户端应用程序获得的公共界面:

然后,我给 dll 起一个强名称,并通过 Regasm.exe 注册它。

现在我转向德尔福客户端。Component > Import Component > Import a Type Library我使用它创建了 tlb 包装器代码

并创建了一个处理程序和一些带有两个按钮和备忘录的表单来测试事情:

所以,我运行它,按下“同步”和“异步”按钮,一切都按预期工作。请注意 Task 的线程 ID 是如何出现在“结束异步调用”行之后的(也有一些延迟,因为Thread.Sleep):

所有作品通过注册-COM

第一部分结束。现在我切换到使用无 Rregistration(并排)COM。基于这个答案dependentAssembly,我在我的 Delphi 应用程序清单中添加了一部分:

使用mt.exe 工具,我为我的 dll 生成了一个清单:

然后我取消注册 dll 并运行应用程序。而且我发现只有回调的同步部分有效:

在此处输入图像描述

编辑:请注意,您必须使用/tlb选项取消注册,否则它将继续在本地计算机上工作,就好像 dll 仍然已注册(请参阅)。

我已经厌倦了很多事情,我不知道下一步该做什么。我开始怀疑最初的方法根本不起作用,我需要在 Delphi 应用程序端实现一些线程。但我不确定是什么以及如何。任何帮助,将不胜感激!