首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为免注册的COM生成清单文件

为免注册的COM生成清单文件
EN

Stack Overflow用户
提问于 2009-01-21 16:07:47
回答 5查看 59.8K关注 0票数 87

我有一些应用程序(一些是本机的,一些是.NET的),它们使用清单文件,这样它们就可以是deployed in complete isolation的,而不需要任何全局COM注册。例如,在与myapp.exe位于同一文件夹中的myapp.exe.manifest文件中声明对dbgrid32.ocx com服务器的依赖关系,如下所示:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity type="win32" name="myapp.exe" version="1.2.3.4" />
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="dbgrid32.ocx" version="5.1.81.4" />
    </dependentAssembly>
  </dependency>
</assembly>

将dbgrid32.ocx和它自己的dbgrid32.ocx.manifest文件一起部署到同一个文件夹中:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity type="win32" name="dbgrid32.ocx" version="5.1.81.4" />
  <file name="dbgrid32.ocx">
     <typelib
        tlbid="{00028C01-0000-0000-0000-000000000046}"
        version="1.0"
        helpdir=""/>
    <comClass progid="MSDBGrid.DBGrid"
       clsid="{00028C00-0000-0000-0000-000000000046}"
       description="DBGrid  Control" />
  </file>
</assembly>

这一切都很好,但手动维护这些清单文件有点痛苦。有没有办法自动生成这些文件?理想情况下,我只想在COM服务器(本机和.NET)列表上声明应用程序的依赖项,然后让其余部分自动生成。有可能吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-01-25 00:50:47

看起来完美的解决方案还不存在。总结一些研究:

生成我的清单 (link)

此工具扫描VB6项目以查找COM依赖项,但它还支持手动声明后期绑定的COM依赖项(即通过CreateObject使用的依赖项)。

有趣的是,此工具将有关依赖项的所有信息放在应用程序清单中。应用程序exe及其依赖项被描述为由多个文件组成的单个程序集。我之前没有意识到这是可能的。

看起来是一个非常好的工具,但是从0.6.6版本开始,它有以下限制:

  • 仅适用于VB6应用程序,从VB6项目文件开始。遗憾的是,因为它所做的很多事情实际上与VB6无关。
  • 向导风格的应用程序,不适合集成在构建过程中。如果您的依赖项不做太多更改,这不是一个大问题。
  • 免费软件没有源代码,依赖它有风险,因为它随时可能成为弃件。

我没有测试它是否支持.NET com库。

regsvr42 (codeproject link)

此命令行工具为本机COM库生成清单文件。它调用DllRegisterServer,然后在将信息添加到注册表中时监视自注册。它还可以为应用程序生成客户端清单。

此实用工具不支持.NET COM库,因为这些库不公开DllRegisterServer例程。

该实用程序是用C++编写的。源代码是可用的。

mt.exe

windows SDK的一部分(可以从MSDN下载),如果您安装了visual studio,则已经有了。它是documented here。您可以使用它为本地COM库生成清单文件,如下所示:

代码语言:javascript
复制
mt.exe -tlb:mycomlib.ocx -dll:mycomlib.ocx -out:mycomlib.ocx.manifest

您可以使用以下代码为.NET COM库生成清单文件:

代码语言:javascript
复制
mt.exe -managedassemblyname:netlib.dll -nodependency -out:netlib.dll.manifest

但是,此工具存在一些问题:

  • 第一个代码段将不会生成progid属性,这会破坏使用带有progid的CreateObject的客户端。
  • 第二个代码段将生成<runtime><mvid>元素,这些元素需要在清单实际用于应用程序的客户端清单之前被剥离。

也许未来的SDK版本会改进这个工具,我在Windows SDK 6.0a (vista)中测试了这个工具。

票数 64
EN

Stack Overflow用户

发布于 2012-06-14 23:22:58

使用MSBuild任务GenerateApplicationManifest,我在命令行生成了一个与Visual Studio生成的清单完全相同的清单。我怀疑Visual Studio在构建过程中使用了GenerateApplicationManifest。下面是我的构建脚本,可以使用msbuild "msbuild build.xml“从命令行运行

感谢Dave Templin和他的post that pointed me the the GenerateApplicationManifest task,以及MSDN的further documentation of the task

build.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="Build">
        <ItemGroup>
            <File Include='MyNativeApp.exe'/>
            <ComComponent Include='Com1.ocx;Com2.ocx'/>
        </ItemGroup>
        <GenerateApplicationManifest
            AssemblyName="MyNativeApp.exe"
            AssemblyVersion="1.0.0.0"
            IsolatedComReferences="@(ComComponent)"
            Platform="x86"
            ManifestType="Native">
            <Output
                ItemName="ApplicationManifest"
                TaskParameter="OutputManifest"/>
        </GenerateApplicationManifest>
    </Target>   
</Project>
票数 32
EN

Stack Overflow用户

发布于 2009-01-21 16:17:49

Make My Manifest (MMM)是一个很好的工具。也可以使用mt.exe编写一个脚本来处理所有的DLL/OCX文件,为每个文件生成一个清单,然后将它们合并在一起。MMM通常更好/更容易,因为它还处理许多特殊/奇怪的情况。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/465882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档