Ich hatte hier das Problem, dass wir in einen VIsual Studio Unit Test eine COM-DLL verwenden müssen. Diesen wollen wir aber nicht auf dem Build-Server registrieren. Um dies zu umgehen, hab ich mittels CreateActCtx / ActivateCtx / usw. eine Klasse gemacht, mit der man ein Manifest zur Laufzeit aktivieren kann. Jetzt war aber das Hauptproblem, dass die Unit-Tests ja von einer Applikation ausgeführt werden, auf dessen Verzeichnis wir keinen Zugriff haben. Im Internet hab ich aber immer nur Beispiele gefunden, wo die COM-DLL im gleichen Verzeichnis wie die EXE lag. Dies geht hier aber nicht, sondern die DLL muss mit einem “DeployItem” auch in das entsprechende Out-Verzeichnis kopiert werden und von dort muss diese COM-DLL dann geladen werden. D.h. das Manifest muss auf diese Datei zeigen.
Ich hab das nicht hinbekommen…. mein erster Versuch war das “lpAssemblyDirectory” Feld in der ACTCTX Struktur zu setzen. Damit hab ich es aber nicht hinbekommen; hab alles erdenkliche versucht… er hat immer gemeldet, dass er die Datei nicht finden kann…
Dann hab ich es in der Manifest-Datei selber probiert. Dort hab ich es nur hinbekommen, wenn der <file name="NameDer.dll">
auf den relativen Pfad geändert hab, also: <file name="test\NameDer.dll">
.
Aber sobald ich einen vollständigen Pfad angegeben hab, ging es nicht mehr… ich bin fast verzweifelt…
Dann endlich kam ich drauf (keine Ahnung wie): Man muss den ganzen Pfad angeben, aber für jeden Slash jeweils *zwei* einfügen! Also:
<file name="C:\\Temp\\Test\\NameDer.dll">
Und siehe da: Es funktioniert, auch wenn die DLL nicht im entsprechenden EXE-Verzeichnis liegt.
Somit können wir jetzt Unit Tests erzeugen, welche eigentlich eine Registrierung von COM-DLLs auf dem Server verlangt hätten.
Mehr Infos dazu siehe:
https://cfx.svn.codeplex.com/svn/Visual%20Studio%202008/CSRegFreeCOMClient/Program.cs
http://www.mazecomputer.com/sxs/help/sxsapi2.htm