2010-01-19 13 views
5

Próbowałem uzyskać bezbłędną bibliotekę DLL COM opartą na .NET do pracy, ale bez powodzenia.Konfigurowanie składników opartych na platformie .NET do aktywacji bez rejestracji

  • W Visual Studio 2008 dodałem nową bibliotekę klasy C#.
  • Włączam opcje "make assembly COM-visible" i "register for COM interop".
  • Dodałem publiczny interfejs i klasę z niektórymi funkcjami.
  • dodałem oczywisty zależność do mojego C++ aplikacji klienckiej: Komentarz #pragma (łącznik "/ manifestdependency ...

Ale kiedy zaczynam moją aplikację otrzymuję„aplikacja nie powiodło się, ponieważ aplikacja konfiguracja jest niepoprawna. "

Użyłem narzędzia Microsoft's mt do wyodrębnienia plików manifestu zarówno aplikacji klienckiej C++, jak i biblioteki DLL C# COM, a informacje w obu są takie same (zależnyAssembly w pliku manifestu C++ zawiera ta sama nazwa i wersja co assemblyIdentity w pliku manifestu COM).

Próbowałem również podejście opisane na http://msdn.microsoft.com/en-us/library/eew13bza.aspx, ale z podobnymi wynikami.

Podobnie próbowałem dodać odniesienie do mojego projektu COM w "Framework and References" mojej aplikacji klienta C++. Informacje na tej stronie właściwości wyglądały obiecująco (zawiera ona opcje takie jak "copy local", "copy dependencies" itp. I właściwości takie jak "assemblyIdentity"), ale program Visual Studio nie kopiuje bibliotek DLL ani nie dodaje automatycznie zależności do pliku manifestu.

Należy zauważyć, że "zarejestrowany wariant" działa poprawnie.

Ktoś ma jakieś pomysły na temat tego, co robię źle?

Aktualizacja:

  • Kiedy tworzę proste C++ DLL i osadzić manifestu o tej samej nazwie i wersji mojego .NET COM DLL (sama assemblyIdentity) moja aplikacja uruchamia grzywny. Problem leży więc w pliku manifestu mojej biblioteki DLL .NET COM.
  • Mogę pomyślnie wyodrębnić manifest z biblioteki DLL za pomocą mt -managedassemblyname:..., a następnie osadzić ten sam manifest za pomocą mt -outputresource:..., ale to również nie powoduje, że system Windows pomyślnie rozwiązuje zależność.

Odpowiedz

4

Znalazłem kroki niezbędne do rejestracji dostać wolne NET COM współdziałanie pracuje się :-)

  • Run: mt -managedassemblyname:"myDll.dll" -out:"myDll.manifest"
  • Clean manifest (patrz formatu na http://msdn.microsoft.com/en-us/library/eew13bza.aspx). Głównie musiałem usunąć wszystkie znaczniki, z wyjątkiem assemblyIdentity, clrClass i file (i w szczególności usunąć tagi runtime, mvid i dependency).
  • Uruchom mt -outputresource:"myDll.dll" -manifest "myDll.manifest". Zasadniczo to dodaje zmodyfikowany manifest jako zasób do biblioteki DLL. Zauważ, że nie jest to ten sam manifest (lokalizacja)! Jeśli ponownie wyślę manifest z opcją managedassemblyname, nadal otrzymam "stary" manifest. Jeśli wyodrębnię to za pomocą opcji inputresource, otrzymam nową.

Prawie wszystko znalazłem dzięki systemowi Windows Vista. W przeciwieństwie do mojego systemu Windows XP zawiera narzędzie o nazwie sxstrace, które zawiera dość szczegółowe informacje na temat problemów związanych z wykonywaniem side-by-side.

+0

Świetne rozwiązanie! To znacznie upraszcza proces instalacji. Wielkie dzięki! –

+0

Witam, mam zestaw C++, który współdziała z zarządzanym zestawem COM i potrzebuję podobnego mechanizmu. Chciałbym ominąć istniejącą implementację .Net i chcieć, aby zadzwonił do mojej nowej implementacji. Z kolei zespół C++ ładowany jest przez .Net exe. A zatem, w jaki sposób manifest powinien być zaprojektowany dla strony C++? –

-2

Kiedy to zrobiłem, zacząłem od bardzo prostego, podstawowego komponentu, aby posortować rzeczy COM. Również użyłem klienta skryptu w początkowej fazie rozwoju.

Nie użyłem programu Visual Studio, ale zamiast tego edytora tekstu dla kodu .NET. Wstawiłem identyfikatory GUID dla zespołu i dla interfejsów oraz zaznaczyłem interfejsy dla AutoDispatch.

using System; 
using Interop=System.Runtime.InteropServices; 

namespace Whatever 
{ 
    [Interop.Guid("xxxxxxxx-9120-4283-b972-changethis05")] 
    [Interop.ComVisible(true)] 
    [Interop.ClassInterface(Interop.ClassInterfaceType.AutoDispatch)] 
    public partial class MyClass : 
    ... 
} 

Upewniłem się, że moja klasa ma domyślny konstruktor (bez argumentów).

Wykonałem ręcznie regasm /codebase z wiersza poleceń, określając zestaw .NET.

Ręcznie kodowałem javascript, aby utworzyć instancję obiektu.

Gdy rzeczy były mylące, sprawdziłem ProgId za pomocą OleView.exe.

Gdy masz już podstawowe rzeczy, stopniowo zwiększaj komplikacje, aż uzyskasz działające rozwiązanie.


Możesz także użyć podejścia z drugiego kierunku; od klienta. Zespoły .NET, takie jak System.Random, są oznaczone jako współdziałanie COM podczas instalacji .NET, więc można ich użyć do sprawdzenia, czy twoje podejście w C++ jest poprawne. Tworzenie instancji System.Random ProgId jest podobne do "hello, World" z C++ - to-.NET-via-COM. Jeśli to się uda, to wiesz, że podstawowym podejściem w C++ jest dźwięk.

+0

Mój interfejs COM działa dobrze. Problem polega po prostu na części bez rejestracji. Nie mogę skutecznie umieścić mojego pliku manifestu, aby moja aplikacja mogła rozwiązać zależność. Ale odpowiedź brzmi. –

Powiązane problemy