87

グローバル COM 登録を必要とせずに完全に分離して展開できるように、マニフェスト ファイルを使用するいくつかのアプリケーション (ネイティブ、.NET) があります。たとえば、dbgrid32.ocx com サーバーへの依存関係は、myapp.exe と同じフォルダーにある myapp.exe.manifest ファイルで次のように宣言されます。

<?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 ファイルと共に同じフォルダーに展開されます。

<?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 の両方) のリストに対するアプリケーションの依存関係を宣言し、残りを自動的に生成したいと考えています。出来ますか?

4

5 に答える 5

64

完璧なソリューションはまだ存在しないようです。いくつかの研究を要約すると:

自分のマニフェストを作成する(リンク)

このツールは、VB6 プロジェクトをスキャンして COM の依存関係を探しますが、レイト バインドされた COM の依存関係 (つまり、CreateObject を介して使用されるもの) の手動宣言もサポートしています。

興味深いことに、このツールは依存関係に関するすべての情報をアプリケーション マニフェスト内に配置します。アプリケーション exe とその依存関係は、複数のファイルで構成される単一のアセンブリとして記述されます。これが可能であるということを以前は知りませんでした。

非常に優れたツールのように見えますが、バージョン 0.6.6 の時点で次の制限があります。

  • VB6 アプリケーションの場合のみ、VB6 プロジェクト ファイルから開始します。残念なことに、それが行うことの多くは実際には VB6 とは何の関係もないからです。
  • ウィザード スタイルのアプリケーションであり、ビルド プロセスへの統合には適していません。依存関係があまり変わらない場合、これは大きな問題ではありません。
  • ソースのないフリーウェアであり、いつでも放棄されたソフトウェアになる可能性があるため、それに依存するのは危険です。

.NET com ライブラリをサポートしているかどうかはテストしていません。

regsvr42 (コードプロジェクト リンク)

このコマンド ライン ツールは、ネイティブ COM ライブラリのマニフェスト ファイルを生成します。DllRegisterServer を呼び出し、レジストリに情報を追加するときに自己登録をスパイします。また、アプリケーションのクライアント マニフェストを生成することもできます。

このユーティリティは、DllRegisterServer ルーチンを公開しない .NET COM ライブラリをサポートしていません。

このユーティリティは C++ で記述されています。ソースコードが利用可能です。

mt.exe

Visual Studio がインストールされている場合は、Windows SDK の一部 ( MSDNからダウンロードできます)。ここに文書化されています。次のように、ネイティブ COM ライブラリのマニフェスト ファイルを生成できます。

mt.exe -tlb:mycomlib.ocx -dll:mycomlib.ocx -out:mycomlib.ocx.manifest

次のように、.NET COM ライブラリのマニフェスト ファイルを生成できます。

mt.exe -managedassemblyname:netlib.dll -nodependency -out:netlib.dll.manifest

ただし、このツールにはいくつかの問題があります。

  • 最初のスニペットは progid 属性を生成せず、progid で CreateObject を使用するクライアントを破壊します。
  • 2 番目のスニペットは 、マニフェストが実際に機能する前に削除する必要がある要素を生成<runtime>します。<mvid>
  • アプリケーションのクライアント マニフェストの生成はサポートされていません。

将来の SDK リリースでこのツールが改善される可能性があります。Windows SDK 6.0a (vista) でテストしました。

于 2009-01-25T00:50:47.190 に答える
32

MSBuild タスクのGenerateApplicationManifestを使用して、Visual Studio が生成するマニフェストと同じマニフェストをコマンド ラインで生成しました。ビルド中にVisual Studio がGenerateApplicationManifest を使用していると思われます。以下は、msbuild "msbuild build.xml" を使用してコマンド ラインから実行できるビルド スクリプトです。

Dave Templin と、GenerateApplicationManifest タスクを指摘してくれた彼の投稿と、タスクに関するMSDN の詳細なドキュメントに感謝します。

build.xml

<?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>
于 2012-06-14T15:22:57.750 に答える
9

Make My Manifest (MMM)は、これを行うための優れたツールです。mt.exeを使用してすべての DLL/OCX ファイルを処理するスクリプトを作成し、それぞれのマニフェストを生成してから、それらをすべてマージすることもできます。MMM は多くの特別な/奇妙なケースも処理するため、通常はより優れた/より簡単です。

于 2009-01-21T16:17:49.143 に答える
8

Unattended Make My Manifestスピンオフを使用して、自動ビルドでマニフェストを直接生成できます。スクリプト ファイルを使用して、依存する COM コンポーネントを追加します。これは、使用可能なコマンドを含むサンプル ini からの抜粋です。

# Unattended MMM script
#
# Command names are case-insensitive. Reference of supported commands:
#
# Command: Identity
#
#   Appends assemblyIdentity and description tags.
#
#   Parameters       <exe_file> [name] [description]
#      exe_file      file name can be quoted if containing spaces. The containing folder 
#                    of the executable sets base path for relative file names
#      name          (optional) assembly name. Defaults to MyAssembly
#      description   (optional) description of assembly
#
# Command: Dependency
#
#   Appends dependency tag for referencing dependent assemblies like Common Controls 6.0, 
#     VC run-time or MFC
#
#   Parameters       {<lib_name>|<assembly_file>} [version] [/update]
#     lib_name       one of { comctl, vc90crt, vc90mfc }
#     assembly_file  file name of .NET DLL exporting COM classes
#     version        (optional) required assembly version. Multiple version of vc90crt can
#                    be required by a single manifest
#     /update        (optional) updates assembly_file assembly manifest. Spawns mt.exe
#
# Command: File
#
#   Appends file tag and collects information about coclasses and interfaces exposed by 
#     the referenced COM component typelib.
#
#   Parameters       <file_name> [interfaces]
#     file_name      file containing typelib. Can be relative to base path
#     interfaces     (optional) pipe (|) separated interfaces with or w/o leading 
#                    underscore
#
# Command: Interface
#
#   Appends comInterfaceExternalProxyStub tag for inter-thread marshaling of interfaces
#
#   Parameters       <file_name> <interfaces>
#     file_name      file containing typelib. Can be relative to base path
#     interfaces     pipe (|) separated interfaces with or w/o leading underscore
#
# Command: TrustInfo
#
#   Appends trustInfo tag for UAC user-rights elevation on Vista and above
#
#   Parameters       [level] [uiaccess]
#     level          (optional) one of { 1, 2, 3 } corresponding to { asInvoker, 
#                    highestAvailable, requireAdministrator }. Default is 1
#     uiaccess       (optional) true/false or 0/1. Allows application to gain access to 
#                    the protected system UI. Default is 0
#
# Command: DpiAware
#
#   Appends dpiAware tag for custom DPI aware applications
#
#   Parameters       [on_off]
#     on_off         (optional) true/false or 0/1. Default is 0
#
# Command: SupportedOS
#
#   Appends supportedOS tag
#
#   Parameters       <os_type>
#     os_type        one of { vista, win7 }. Multiple OSes can be supported by a single 
#                    manifest
#

32 ビットまたは 64 ビットの Windows で動作します。

于 2009-10-14T19:22:08.933 に答える