Создание файлов манифеста для регистрации-бесплатный COM



у меня есть некоторые приложения (некоторые собственные, некоторые .NET), которые используют файлы манифеста, чтобы они могли быть развернут в полной изоляции, не требуя никакой глобальной регистрации COM. Например, зависимость от dbgrid32.ocx com-сервер объявляется следующим образом в myapp.исполняемый.файл манифеста, который находится в той же папке, что и myapp.exe:



<?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.ОКС.декларация файл:



<?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), а затем позволить остальным генерироваться автоматически. Возможно ли это?

1589   5  

5 ответов:

похоже, что идеальное решение еще не существует. Подводя итог некоторым исследованиям:

Сделайте Мой Манифест (ссылке)

этот инструмент сканирует проект VB6 для поиска зависимостей COM, но он также поддерживает ручное объявление поздних зависимостей COM (т. е. тех, которые используются через CreateObject).

интересно, что этот инструмент помещает всю информацию о зависимостях внутри манифеста приложения. Приложение exe и его зависимости описываются как одна сборка, состоящая из нескольких файлов. Раньше я и не подозревал, что такое возможно.

выглядит как очень хороший инструмент, но в версии 0.6.6, он имеет следующие ограничения:

  • только для приложений VB6, начинается из файла проекта VB6. Стыдно, потому что многое из того, что он действительно не имеет ничего общего с VB6.
  • приложение стиля мастера, не подходит для интеграции в сборку процесс. Это не огромная проблема, если ваш зависимости не сильно меняются.
  • freeware без источника, рискованно полагаться на него, потому что он может стать abandonware в любой момент.

Я не проверял, поддерживает ли он библиотеки .NET com.

regsvr42 ( codeproject link)

этот инструмент командной строки создает файлы манифеста для собственных библиотек COM. Он вызывает DllRegisterServer, а затем шпионит за саморегистрацией, как это добавляет информацию в реестр. Он также может создавать манифест клиента для приложений.

эта утилита не поддерживает библиотеки .NET COM, так как они не предоставляют процедуру DllRegisterServer.

утилита написана на C++. Исходный код доступен.

mt.exe

часть Windows SDK (можно загрузить с MSDN), который у вас уже есть, если у вас установлена visual studio. Это документы. Вы можете создавать файлы манифеста для собственных библиотек 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, взлом клиентов которые используют CreateObject с progids.
  • второй фрагмент будет генерировать <runtime> и <mvid> элементы которые должны быть удалены перед манифесты действительно работают.
  • генерация клиентских манифестов для приложения не поддерживаются.

возможно, будущие выпуски SDK улучшат этот инструмент, я протестировал его в Windows SDK 6.0 a (vista).

С задачей MSBuild GenerateApplicationManifest Я создал манифест в командной строке, идентичный манифесту, который создает Visual Studio. Я подозреваю, что Visual Studio использует GenerateApplicationManifest во время построения. Ниже приведен мой скрипт сборки, который можно запустить из командной строки с помощью msbuild "msbuild build.XML-код"

спасибо Дэйву Темплину и его сообщение, которое указало мне задачу GenerateApplicationManifest, и дальнейшая документация задачи.

построить.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>

сделать мой манифест (ТТТ) - это хороший инструмент для этого. Также можно написать скрипт для обработки всех ваших DLL / OCX файлов с помощью mt.exe создать манифест для каждого из них, а затем объединить их все вместе. МММ обычно лучше / проще, потому что он также обрабатывает множество специальных/странных случаев.

можно использовать Без Присмотра Сделать Мой Манифест spin off для создания манифестов непосредственно в автоматизированных сборках. Он использует файл сценария для добавления зависимых компонентов 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
#

заполнить идентификаторы progid, что МТ.exe не включает, вы можете позвонить ProgIDFromCLSID чтобы посмотреть их из реестра. Это требует традиционной регистрации COM до завершения файла манифеста, но впоследствии файл манифеста будет самодостаточным.

этот код C# добавляет ProgIDs ко всем классам COM в манифесте:

var manifest = XDocument.Load(fileName);
var namespaceManager = new XmlNamespaceManager(new NameTable());
namespaceManager.AddNamespace("s", "urn:schemas-microsoft-com:asm.v1");
foreach (var classElement in manifest.XPathSelectElements("s:assembly/s:file/s:comClass", namespaceManager)) {
    var clsid = Guid.Parse(classElement.Attribute("clsid").Value);
    int result = ProgIDFromCLSID(ref clsid, out string progId); if (result != S_OK) throw new COMException($"ProgID lookup failed for {clsid}.", result);
    classElement.SetAttributeValue("progid", progId);
}
manifest.Save(fileName);

код опирается на эти определения взаимодействия:

[DllImport("ole32.dll")] static extern int ProgIDFromCLSID([In] ref Guid clsid, [MarshalAs(UnmanagedType.LPWStr)] out string lplpszProgID);
const int S_OK = 0;

Comments

    Ничего не найдено.