问题标签 [regfreecom]
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.
com-interop - 免注册COM,无需将dll复制到可执行文件所在目录
如何在不将 dll 复制到可执行文件所在目录的情况下使用免注册 COM 对象?这可能吗?
我想要一个完整的工作示例或针对我的确切场景的详细分步指南。
例如,我有以下组件:
CppTestRunner.exe - vc++ 控制台应用程序
CppTests.dll - vc++ mfc dll
CsCOMServer.dll - c# COM 可见 dll
我不想修改 exe 或其目录,例如添加外部清单。
CppTests.dll 与 exe 位于不同的目录中。
如果 CsCOMServer.dll 与 CppTests.dll 位于同一目录中,则可以。
CppTestRunner.exe 调用 CppTests.dll 上的 LoadLibrary 工作正常。
嵌入清单并使用 Windows 激活上下文 API 后,我能够将 CsCOMServer.dll 复制到 exe 目录,以验证 CppTests.dll 可以毫无问题地创建 CsCOMServer.dll 的实例,但我再次尝试避免这一步.
目前,CsCOMServer.dll 与 CppTests.dll 在同一目录中,而 exe 目录中没有 CsCOMServer.dll,我在调用 CoCreateInstance 时收到以下错误:
错误 = 0x80070002 系统找不到指定的文件。
我使用 sysinternals 进程监视器来跟踪 CppTestRunner.exe 查找的路径等。
我注意到根据我尝试做的事情,有时 CppTestRunner.exe 会尝试读取与 CppTests 相同目录中的 CsCOMServer.dll.config。 dll,但无论我尝试在那里放什么,我都无法克服错误。
此外,根据我尝试做的其他事情,CppTestRunner.exe 尝试读取与 CppTests.dll 相同目录中的 CsCOMServer.dll 但由于某种原因,我仍然遇到相同的错误。
有人知道这种确切情况下的工作代码吗?
正如您可能知道的那样,这是一些单元\集成测试的一部分。
作为一个简单的解决方法,我目前将 CppTestRunner.exe 复制到与 CppTests.dll 相同的目录并从那里运行它,但想避免这一步。
谢谢你。
com - 如何调试免注册表 COM?
我有一个混乱的情况,包装了几个 3rd 方 COM 组件。实际上它是一个 COM 组件和几个 .NET 程序集。.NET 程序集又依赖于相同的第 3 方的内部 COM 组件。当我注册了 COM DLL 后,我的代码可以正常工作(现在我正在从 C# 进行测试)。当我不这样做时,它会失败。调试它的最佳方法是什么?
我通过添加对 COM 组件的引用、设置 Isolated=true、然后将生成的 comClass 元素从清单中提取到我自己的 SxS 清单中来生成 SxS 清单。此外,它似乎创建了一个 Interop.XXX.dll 文件:这是为了什么?
一些示例错误消息:
vba - 从 Excel 调用具有 ocx 依赖项的 RegFree COM vb6 dll
我使用 MMM 生成一个清单文件,以通过 VB6.exe 客户端调用具有 OCX 依赖项的 VB6 DLL,这在目标机器上可以正常工作。
清单文件的摘录如下所示,其中显示了 VB6 MS 图表控件依赖项 (MSCHRT20.ocx)
我想在 Excel 中使用 Windows 7 中的 Windows.ActCtx 对象使这项工作免于注册。如果我只使用没有 .ocx 依赖项的简单测试 HelloWorld VB6 dll,这在目标机器上的 Excel 2010 中可以正常工作
关于我使用的测试清单文件,请参见下文
但是,如果我尝试使用具有 ocx 依赖项的完整 dll 的相同技术,它会在目标计算机上给出错误代码 339(找不到 ocx 依赖项)
所有文件都在 XCOPY 部署的一个文件夹中。
总而言之,它适用于 VB6 客户端,但不适用于 VBA / ActCtx 客户端。任何想法为什么这不起作用?
谢谢大卫
c# - 使用 EXE 注册免费 COM 错误
我正在尝试使用 EXE 公开的 COM 函数。我使用 Visual Studio 2010(在 windows7/x64 机器上)创建了一个 C# 项目,并添加了对该 EXE 的引用,然后将隔离标志设置为 true。当我构建解决方案时,我得到它公开的每个类的错误。
隔离 COM 引用“FNCClient11Lib”时出现问题:注册表项“HKEY_CURRENT_USER\SOFTWARE\CLASSES\CLSID{e49b30c9-6d7e-48f5-91da-f2f0414c6a13}\InProcServer32”缺少值“(默认)”。
这些条目在该位置的注册表中不存在,但在此处存在(如下)
HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID{E49B30C9-6D7E-48F5-91DA-F2F0414C6A13}
- 有什么方法可以在构建时将其指向注册表中的正确位置?
- 我可以引用一个EXE吗?到目前为止,我看到的所有示例都仅引用 DLL。
c# - 如何从 .ocx 文件动态实例化 ActiveX 控件?
我想创建一个 ActiveX 控件的实例。给定 C# 中的 .ocx 文件和接口定义,我该怎么做?我不是指添加对项目的引用的常用方法,因为我想避免在目标系统上全局注册控件的需要。
asp.net - 来自 ASP.NET 的免注册 COM?
Windows 允许使用 COM 对象而无需注册 COM dll。
该机制是在应用程序的清单中包含一个“依赖程序集”:
MyProgram.exe.manifest
然后您的文件夹包含:
MyProgram.exe
MyProgram.exe.manifest
(如果您使用的是外部清单;也可以嵌入在RT_MANIFEST
资源中)Contoso.Frobber.manifest
(COM DLL 清单)confrob.dll
(包含我们要使用的 COM 类的 dll)
COM dll 的程序集清单包含:
Contoso.Frobber.manifest
优秀的。我现在可以使用(本机或 .NET)可执行文件中的 COM 对象,而无需注册 COM 对象。
现在我想使用来自ASP.NET 网站的 COM 对象,而不注册 COM 对象。
可能的?
奖金喋喋不休
Windows 还允许exe 调用 .NET 库,而无需将 .NET 程序集安装到全局程序集缓存中。
c# - 如何在 dot net 中使用无注册 COM dll
在我的一个项目中,我有使用 C++ DLL 的 c# 应用程序。目前在客户端 PC 上,我们正在注册表中的 COM 组件中注册 C++ DLLS,以便我们在 C# 中使用它们。
我在 NET 上了解到,微软提供了一个 Reg Free 解决方案,链接为http://msdn.microsoft.com/en-us/library/ms973913.aspx
但是在阅读后我没有得到太多线索,因为我的应用程序架构与以下不同
- 我有 2 个 C++ dll,让我们说 CPForms.dll 和 Rules.dll。
- Rule.dll 包含在 CPForms.dll 中
- 我有 1 个 C# dll,比如说 ConsumeForm.dll,它正在使用 CPForms.DLL
- 我有另一个使用 ConsumeForm.dll 的 C# Exe
我的客户端只打开 C# Exe,而后者又调用 ConsumeForm.dll,后者进一步调用显示 C++ 表单 (UI) 的 CPForms.dll,当用户使用 C++ Rules.dll 在内部单击该按钮时,有按钮验证。目前我正在注册表中注册两个 C++ dll。
现在客户只希望 Rule.dll 被引用为 RegFree 安装,因为 Rule.dll 经常更改,客户不想使用 Admin 帐户一次又一次地注销和注册。
除此之外,该客户端可以注册 CPForms.dll。
我的问题是我们如何生成清单文件?以及它将如何在我的场景中工作?
c# - 是否可以在作为浏览器中的 ActiveX 控件运行的程序集中使用免注册 COM?
我已经为此烦恼了一段时间,并且接近得出结论,我正在尝试做的事情是不可能的,但我想给 Stack Overflow 的人们一个机会,希望在继续之前证明我错了另一种策略。
我正在尝试做什么 我的项目是一个 .NET 程序集,它作为一个 ActiveX 控件(控件 A)向 COM 公开,旨在在浏览器中运行。它依赖于我试图通过来自控件 A 的无注册 COM 使用的第三方 ActiveX 控件(控件 B)。
所以所需的堆栈如下所示:
Internet Explorer
[COM]
Ax Control A (My Control)
[Reg-Free COM]
Ax Control B (第三方)
为什么我要尝试这样做 我想使用免注册 COM,因为与使用 Control B 的另一个应用程序的版本控制冲突结合了 Control B 没有正确实现版本控制的事实(两个不兼容的版本存在具有相同的 GUID)。免注册 COM 似乎是隔离控件 B 的两个版本的唯一可行方法。
我不需要浏览器通过免注册 COM 调用我的控件(控件 A),我只是计划为此使用正常机制。
到目前为止我所做 的鉴于浏览器是运行整个堆栈的最终应用程序,并且让用户为 Internet Explorer 添加清单文件是不切实际或不可取的,我的方法是嵌入显示到控件 A 以使其使用免注册 COM 调用控件 B。
我已经设法将清单嵌入到控件 A 中,并使用第三方工具来验证它确实是嵌入的。为了简化我的测试,我将浏览器排除在外,并一直在通过一个简单的 C# 表单应用程序测试免注册 COM。但是,我似乎无法让免注册 COM 在该环境中工作。
出于测试目的,我为测试表单应用程序创建了一个清单,其中包含我嵌入到控件 A 中的信息,并且在该配置中,无论是否注册了控件 B,它都可以工作。如果我的应用程序要在该测试应用程序而不是浏览器中运行,那就太好了。我做了这个测试只是为了确认我嵌入的清单是正确的,我相信我已经确认了。
什么不工作意味着 测试 Windows 窗体应用程序运行良好,并显示控件 A 和(嵌套的)控件 B,而控件 B 已注册。但是,当我取消注册 Control B 并尝试依赖免注册 COM 时,应用程序会立即抛出此错误(UFV=Control A):
我的问题
(1) 我是不是找错树了?也就是说,是否可以像我正在尝试的那样在堆栈中间使用免注册 COM,或者清单是否必须嵌入到 EXE 文件本身(或清单文件中)?
(2) 如果无法做到这一点,为什么清单合并工具 (MT.EXE) 甚至允许您将清单嵌入到 DLL 文件中?
(3)如果可能的话,我是否在某处遗漏了一步?这样做有诀窍吗?
c# - C# dll 和 vc++ dll 中 COM dll 的免注册激活有何不同?
我是 COM dll 的免费注册激活的新手,几天前我在 c# 应用程序中的 Reg free 上发布了一个问题,我能够成功完成。
现在期待我有两个不同的要求如下
- 我们可以在 c# dll(类库项目)中使用免费注册的 COM dll 激活吗?
- 我们可以使用COM dll inisde VC++ dll项目的免费注册激活吗?
在 c# dll 和 vc++ dll 中实现无注册 COM 有什么区别吗?因为我已经在 c# 窗口应用程序中完成了,我只是将 COM 的独立属性设置为 true 并自动 VS 为应用程序生成关于 COM dll 的清单
我在开发机器中使用VS2010。
.net - RegFree COM 从 C# 工作,而不是从 VBA 工作
我目前正试图让无需注册的 COM 使用 Excel 作为客户端,使用 .NET dll 作为服务器。目前,我只是试图让概念验证工作,但遇到了麻烦。
显然,当我使用 Excel 时,我不能简单地使用与可执行文件一起存在的客户端清单,所以我正在使用Microsoft.Windows.ActCtx
( link )
我将客户端清单、程序集清单和 dll 都放在同一个位置。
不幸的是,在 C# 中起作用的东西似乎在 Excel / VBA 中不起作用,我对原因感到困惑。虽然 C# 测试客户端运行良好,但 VBA 给出了80070002错误,消息Method 'CreateObject' of object 'IActCtx' failed。
COMTestObject
我有一个 .NET dll (COMTestService.dll) 向 COM ( / ) 公开单个类/接口ICOMTestObject
,如下所示:
客户端清单(COMTestService_Client.manifest):
程序集清单 (COMTestService.manifest):
VBA 客户端代码:
C# 客户端代码:
编辑
情节变厚了...只是为了好玩,我编写了一个快速的 COM 可见的 REGISTERED 辅助类来在 C# 中创建对象,然后使用类似于public object CreateObject(string manifestPath, string typeName)
Now 的方法将其传回,从 C# exe 调用它有效很好,但从 VBA 调用它失败(80070002 再次,消息:系统找不到指定的文件。)。现在我更迷茫了……
在此先感谢您的帮助,如果我需要提供更多信息,请告诉我,我很乐意提供帮助!