등록이 필요없는 COM 용 매니페스트 파일 생성



Answers

MSBuild 작업 GenerateApplicationManifest 사용하여 Visual Studio에서 생성 한 매니페스트와 동일한 명령 줄에서 매니페스트를 생성했습니다. Visual Studio에서는 빌드하는 동안 GenerateApplicationManifest 사용합니다. 아래는 msbuild "msbuild build.xml"을 사용하여 명령 줄에서 실행할 수있는 빌드 스크립트입니다.

Dave Templin과 자신의 게시물 덕분에 GenerateApplicationManifest 작업 과 MSDN의 GenerateApplicationManifest 알려주었습니다 .

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>
Question

일부 전역 COM 등록을 요구하지 않고도 완전히 격리 된 상태배포 할 수 있도록 매니페스트 파일을 사용하는 일부 응용 프로그램 (일부 기본, 일부 .NET)이 있습니다. 예를 들어, myapp.exe와 동일한 폴더에있는 myapp.exe.manifest 파일에서 dbgrid32.ocx com 서버에 대한 종속성이 다음과 같이 선언됩니다.

<?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 모두)에 대한 응용 프로그램의 종속성을 선언 한 다음 나머지는 자동으로 생성하도록하고 싶습니다. 가능한가?




무인 상태로 내 매니페스트를 스핀 오프하여 자동화 된 빌드에서 직접 매니페스트를 생성 할 수 있습니다. 스크립트 파일을 사용하여 종속 된 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
#



Related