TL; DR是否所有生成的注册表项都regsvr32
需要出现在SxS reg-free-COM清单中,反之亦然?
我正在尝试获得免注册的COM用于第三方组件.
读 了 关于主题,我发现有提到的几个要素,即可以放入一个清单:
从文档中,我们可以将以下标记添加到清单中以描述COM组件:
assemblyIdentity
- 据我所知,这真的只是描述了"抽象集会 "comClass
- 描述COM类(IID接口).看来,这总是需要的.typelib
- 什么时候?comInterfaceExternalProxyStub
- 什么时候?comInterfaceProxyStub
- 什么时候?从其他文档HKEY_LOCAL_MACHINE\SOFTWARE\Classes
我们可以看到COM注册表项有几个类别:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{CLSID}
我假设大致相当于comClass
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{IID}
将对应于任何一个 comInterface[External]ProxyStub
,但我真的不知道何时使用哪个(或两者)typelib
清单条目?使用regsvr42来提取我试图注册的dll会产生一个只包含comClass
条目,没有typelib或ProxyStub条目的清单.(我交叉检查写的密钥,有问题的DLL pdm.dll
,MS的Process Debug Manager只写那些密钥,也就是说,注册表中没有明显的类型库或代理存根信息.)
如果注册表只包含与此相关的信息,comClass
则表示此信息在SxS清单中是足够的,或者清单中是否需要其他信息?
另外,我注意到注册表包含a VersionIndependentProgId
和a ProgId
,其末尾附加了版本号.清单只有一个ProgId
条目,文档说明:
progid:与COM组件关联的与版本相关的编程标识符.ProgID的格式是
<vendor>.<component>.<version>
.
但文档也说明了这一点
该comClass元素可以有
<progid>...</progid>
子元素,其中列出的版本有关的ProgID.
并且他们说 progid属性应该是版本独立的属性.
那么,放在这里的是什么?当客户端没有请求特定版本时,它是否重要?
我们有一个.NET C#应用程序,它使用Adobe ActiveX控件.对于Adobe Acrobat和Adobe Reader的版本7-10,要使用此控件,您需要打开"在浏览器中显示PDF"设置.您可以使用GUI从GUI手动执行此操作
Preferences > Internet > Display PDFs in browser
Run Code Online (Sandbox Code Playgroud)
或通过直接设置注册表设置以编程方式
HKEY_CURRENT_USER\Software\Adobe\(Product Name)\(Version)\Originals
"bBrowserIntegration"=dword:00000001
Run Code Online (Sandbox Code Playgroud)
其中包含SDK参考http://www.adobe.com/devnet-docs/acrobatetk/tools/PrefRef/Windows/Originals.html#BrowserIntegration.当我们的客户拥有Adobe Reader或Adobe Acrobat的7-10版本时,我们的应用程序一直在以编程方式设置此注册表值.上面的链接还表明bBrowserIntegration
在XI(11)中不推荐使用此注册表项.旧版注册表路径仍然存在于新版本中,即:
HKEY_CURRENT_USER\Software\Adobe\(Product Name)\(Version)\Originals
Run Code Online (Sandbox Code Playgroud)
但是,bBrowserIntegration
正如文档所示,不再有密钥,它已被弃用.
只要启用了"在浏览器中显示PDF",Adobe ActiveX Control似乎仍可以正常工作,就像它一直有效一样.
对于版本XI(11)和DC,有两个已发布的链接,清楚地显示如何手动实现此目的:
XI (11): https://helpx.adobe.com/acrobat/11/using/display-pdf-browser-acrobat-xi.html
DC (current): https://helpx.adobe.com/acrobat/using/display-pdf-in-browser.html
Run Code Online (Sandbox Code Playgroud)
在测试Adobe Reader DC时,如果我们没有完成在浏览器中为新客户安装启用显示PDF的步骤,那么我们的应用程序将抛出一个COM error
,然后如果我们按照上面链接中的说明启用设置,一切正常正如我们的应用程序预期的那样,它使用Adobe ActiveX控件呈现PDF,这与我们期望在未设置注册表设置时在旧版本(7-10)中看到的类似(请参阅我之前的旧帖子和我自己的解决方案)如何逐步诊断原因,修复或解决与Adobe ActiveX/COM相关的错误0x80004005?).
因此,问题仍然是,通过相应地设置注册表设置bBrowserIntegration
,对于今天的XI或DC中的手动过程或等同于7-10中的手动过程,预期的程序等效是什么.我们希望能够打开它,然后在我们的应用程序结束时将其重置为之前的设置(因此我们的应用程序不会因为我们的应用程序需要而强制用户保留设置)这就是我们今天所做的7 -10.
我似乎无法在线找到任何从开发人员角度启用/禁用浏览器集成的参考资料,因此我们的应用程序可以继续使用ActiveX控件而不会显示COM错误,从而强制用户手动更改此错误.
首要任务是了解DC的解决方案,因为这代表了Adobe Acrobat/Reader的新范例.
TLDR:我正在尝试从.Net COM dll调用异步回调到Delphi客户端.exe,但这些似乎在免注册COM中无法正常工作,而同步回调确实有效,并且异步回调正在工作时不是一个免注册的COM.
我的全球案例是,我有一个外国的闭源.Net dll暴露了一些公共事件.我需要将这些事件传递给Delphi应用程序.所以我决定制作一个中间的.dll,它可以作为我的app和另一个dll之间的COM桥.当我的dll通过regasm注册时,它运行得很好,但是当我切换到免注册COM时情况变得更糟.我将我的情况缩短为可重复的小例子,它不依赖于其他dll,所以我将在下面发布它.
基于这个答案我创建了一个公共接口ICallbackHandler
,我希望从Delphi客户端应用程序获得:
namespace ComDllNet
{
[ComVisible(true)]
[Guid("B6597243-2CC4-475B-BF78-427BEFE77346")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ICallbackHandler
{
void Callback(int value);
}
[ComVisible(true)]
[Guid("E218BA19-C11A-4303-9788-5A124EAAB750")]
public interface IComServer
{
void SetHandler(ICallbackHandler handler);
void SyncCall();
void AsyncCall();
}
[ComVisible(true)]
[Guid("F25C66E7-E9EF-4214-90A6-3653304606D2")]
[ClassInterface(ClassInterfaceType.None)]
public sealed class ComServer : IComServer
{
private ICallbackHandler handler;
public void SetHandler(ICallbackHandler handler) { this.handler = handler; }
private int GetThreadInfo()
{
return Thread.CurrentThread.ManagedThreadId;
}
public void SyncCall()
{
this.handler.Callback(GetThreadInfo());
}
public void AsyncCall()
{
this.handler.Callback(GetThreadInfo());
Task.Run(() …
Run Code Online (Sandbox Code Playgroud) 我正在将InstallShield项目转换为基于WiX的安装程序.我有许多VB6项目需要注册二进制文件.
InstallShield项目实际上将这些标记为自注册文件.从我所看到的,这似乎是Windows Installer世界中的"坏事".
我的问题是,那我该怎么办?每次重新编译后,VB6项目的内部GUID都会发生变化 - 是的,我已经在使用二进制兼容性了.
我使用Heat来生成所有注册表和类条目,但其中一些条目从构建更改为构建.我已经读过,Heat不是为每次构建而设计的,而是用作起点.
其他人正在做什么来处理VB6和WiX注册?
在我的一个项目中,我有一个使用C++ DLL的c#应用程序.目前在客户端PC上,我们在注册表中的COM组件上注册C++ DLLS,以便我们在C#中使用它们.
我在NET上了解到有一个免费解决方案可以从微软获得链接http://msdn.microsoft.com/en-us/library/ms973913.aspx
但阅读后我没有太多线索,因为我的应用程序架构如下所示
我的客户端只打开C#Exe,后者又调用ConsumeForm.dll,它进一步调用CPForms.dll,显示C++表单(UI),有按钮验证,当用户在内部使用C++ Rules.dll单击该按钮时.目前我在注册表中注册了两个C++ dll.
现在客户端只希望将Rule.dll作为RegFree安装引用,因为Rule.dll经常更改,并且客户端不想使用管理员帐户一次又一次地注销和注册.
其他那个客户端可以注册CPForms.dll.
我的问题是我们如何生成清单文件?它在我的场景中将如何运作?
我想向我的 .NET 应用程序添加免注册 COM 引用。免注册意味着用户无需将 COM 组件注册到他们的系统即可运行应用程序。
我找到了很多关于这个主题的文章(例如MSDN、这个 S/O 问题等),但没有一篇包含具体步骤。这是我尝试过但没有奏效的方法:
foo.dll
如本答案中所述,使用 mt.exe 为COM dll 生成清单(例如)。foo.dll
和foo.dll.manifest
到我的应用程序作为“构建操作”=“内容”和“复制到输出目录”=“始终复制”。interop.foo.dll
随附的引用foo.dll
。使用此部分添加应用清单文件:
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="foo" />
</dependentAssembly>
</dependency>
Run Code Online (Sandbox Code Playgroud)构建并运行。
有一个错误说应用程序配置不正确。在<assemblyIdentity>
没有运气的情况下尝试了不同的值。
有人可以分享经验吗?谢谢。
Windows Installer自我修复可能会给开发人员,系统管理员和最终用户带来问题.如果您的MSI体验有限,找到解决方案可能会很困难.
这是一个Q&A风格的答案,旨在作为解决自修复问题的检查清单.以下是一些常见问题场景:
关键字:Windows Installer意外启动.MSI意外显示.每次都会出现Windows Installer.打开应用程序启动Windows Installer.Windows Installer自我修复.包如何自我修复.微星自我修复最佳实践.Windows Installer修复.自我修复.禁用Windows Installer.Windows Installer反复运行.应用程序快捷方式启动安装程序.Windows Installer意外出现.
到目前为止我还没有另外一台PC可以对它进行测试,其他没有VB6系统的用户(没有dll注册或运行时文件)可以运行我的应用程序,只需将activeX文件,DLL和运行时文件包含在应用程序的文件夹??? 不需要注册DLL?如果是这样,无论如何都要注册它们而不通过安装程序执行此操作?