Ich habe einige Anwendungen (einige native, einige .NET), die Manifestdateien verwenden, damit sie vollständig isoliert bereitgestellt werden können , ohne dass eine globale COM-Registrierung erforderlich ist. Beispielsweise wird die Abhängigkeit vom com-Server dbgrid32.ocx in der Datei myapp.exe.manifest, die sich im selben Ordner wie myapp.exe befindet, wie folgt deklariert:
<?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>
Die Datei dbgrid32.ocx wird zusammen mit ihrer eigenen Datei dbgrid32.ocx.manifest im selben Ordner bereitgestellt:
<?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>
Dies alles funktioniert gut, aber das manuelle Verwalten dieser Manifestdateien ist ein bisschen mühsam. Gibt es eine Möglichkeit, diese Dateien automatisch zu generieren? Im Idealfall möchte ich nur die Abhängigkeit der Anwendung von einer Liste von COM-Servern (sowohl native als auch .NET) deklarieren und dann den Rest automatisch generieren lassen. Ist es möglich?
Antworten:
Es sieht so aus, als ob die perfekte Lösung noch nicht existiert. Um einige Forschungsergebnisse zusammenzufassen:
Mein Manifest machen ( Link )
Dieses Tool durchsucht ein VB6-Projekt nach COM-Abhängigkeiten, unterstützt jedoch auch die manuelle Deklaration spät gebundener COM-Abhängigkeiten (dh der über CreateObject verwendeten).
Interessanterweise fügt dieses Tool alle Informationen zu den Abhängigkeiten in das Anwendungsmanifest ein. Die Anwendungs-Exe und ihre Abhängigkeiten werden als eine einzelne Assembly beschrieben, die aus mehreren Dateien besteht. Ich hatte vorher nicht bemerkt, dass dies möglich war.
Sieht nach einem sehr guten Tool aus, hat jedoch ab Version 0.6.6 die folgenden Einschränkungen:
Ich habe nicht getestet, ob es .NET-Com-Bibliotheken unterstützt.
regsvr42 ( Codeprojekt-Link )
Dieses Befehlszeilentool generiert Manifestdateien für native COM-Bibliotheken. Es ruft DllRegisterServer auf und spioniert dann die Selbstregistrierung aus, während es Informationen zur Registrierung hinzufügt. Es kann auch ein Client-Manifest für Anwendungen generieren.
Dieses Dienstprogramm unterstützt keine .NET COM-Bibliotheken, da diese keine DllRegisterServer-Routine verfügbar machen.
Das Dienstprogramm ist in C ++ geschrieben. Der Quellcode ist verfügbar.
mt.exe
Ein Teil des Windows SDK (kann von MSDN heruntergeladen werden ), das Sie bereits haben, wenn Sie Visual Studio installiert haben. Es ist hier dokumentiert . Sie können damit Manifestdateien für native COM-Bibliotheken wie folgt generieren:
Sie können damit Manifestdateien für .NET COM-Bibliotheken wie folgt generieren:
Es gibt jedoch einige Probleme mit diesem Tool:
<runtime>
und<mvid>
Elemente, die entfernt werden müssen, bevor die Manifeste tatsächlich funktionieren.Vielleicht werden zukünftige SDK-Versionen dieses Tool verbessern. Ich habe das im Windows SDK 6.0a (Vista) getestet.
quelle
Mit der MSBuild-Task GenerateApplicationManifest habe ich in der Befehlszeile ein Manifest generiert, das mit dem von Visual Studio generierten Manifest identisch ist. Ich vermute, dass Visual Studio während des Builds das GenerateApplicationManifest verwendet . Unten ist mein Build-Skript, das über die Befehlszeile mit msbuild "msbuild build.xml" ausgeführt werden kann.
Vielen Dank an Dave Templin und seinen Beitrag, der mich auf die GenerateApplicationManifest-Aufgabe und die weitere Dokumentation der Aufgabe durch MSDN hingewiesen hat .
build.xml
quelle
Make My Manifest (MMM) ist ein gutes Werkzeug dafür. Es ist auch möglich, ein Skript zu schreiben, um alle Ihre DLL / OCX-Dateien mit mt.exe zu verarbeiten , um für jede ein Manifest zu generieren und sie dann alle zusammenzuführen. MMM ist normalerweise besser / einfacher, da es auch viele spezielle / seltsame Fälle behandelt.
quelle
Mit dem Spin-off " Unbeaufsichtigtes Make My Manifest" können Sie Manifeste direkt in automatisierten Builds generieren. Es verwendet eine Skriptdatei, um abhängige COM-Komponenten hinzuzufügen. Dies ist ein Auszug aus dem Beispiel ini mit den verfügbaren Befehlen:
Es läuft unter 32- oder 64-Bit-Windows.
quelle
Um die ProgIDs auszufüllen, die in mt.exe nicht enthalten sind, können Sie sie aufrufen
ProgIDFromCLSID
, um sie in der Registrierung nachzuschlagen . Dies erfordert eine herkömmliche COM-Registrierung vor dem Ausfüllen der Manifestdatei. Anschließend ist die Manifestdatei jedoch autark.Dieser C # -Code fügt die ProgIDs allen COM-Klassen in einem Manifest hinzu:
Der Code basiert auf diesen Interop-Definitionen:
quelle