2011-09-08 9 views
5

Załóżmy, że chcę wyświetlić pełną nazwę zespołu, podając tylko ścieżkę do pliku zespołu.uzyskiwanie pełnej nazwy zespołu

Wiem, że mógłbym napisać program wiersza poleceń lub skrypt powłoki administratora z łatwością, ale czy środowisko wykonawcze zawiera polecenie, którego mógłbym użyć? (Widziałem gacutil zrobić dla zespołów, które są w GAC, ale o zespołach, które nie są zarejestrowane?)

Odpowiedz

5

Głównym problematyczne częścią pełnej nazwy jest zwykle kluczem żeton publicznego. Można ją uzyskać wpisując to w Visual Studio okno wiersza polecenia:

sn -T path\to\your.dll 

Osobiście uważam, że łatwiej jest załadować dll do reflektora, choć. To pokazuje pełną nazwę w dolnym panelu.

+4

+1, za faktyczne zrozumienie tego, o co tu chodzi. –

+0

Zamiast ładować go do reflektora, wystarczy napisać aplikację na konsolę: D – Jamiec

+1

@Jamiec jestem pewien, ale mam reflektor łatwo dostępny. –

4

Formularz ten można uzyskać poprzez AssemblyName:

var name = AssemblyName.GetAssemblyName(path); 
var fullname = name.FullName; 

ten unika faktycznie ładowanie zestawu w twój proces.

+0

Niestety, to nie jest to, czego szukam. Wiem, jak to zrobić w kodzie. To, czego szukałem, to opcja linii komend, bo muszę nauczyć osobę wsparcia, jak to zrobić. Miałem nadzieję, że istnieje wbudowany cmd, który dostarczyłby mi to, co chciałem - zakończył się przetaczaniem własnych. JEDNAK - użyłem Assembly.ReflectionLoadFrom(). Przełączę się na używanie AssemblyName.GetAssemblyName +1 dla wskazówki AssemblyName w każdym razie. – JMarsch

0
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name 
+0

Niestety, nie tego szukam. Wiem, jak to zrobić w kodzie. To, czego szukałem, to opcja linii komend, bo muszę nauczyć osobę wsparcia, jak to zrobić. Miałem nadzieję, że istnieje wbudowany cmd, który dostarczyłby mi to, co chciałem - zakończył się przetaczaniem własnego – JMarsch

17

myślę szukasz System.Reflection.AssemblyName.GetAssemblyName:

AssemblyName name = AssemblyName.GetAssemblyName(@"C:\path\assembly.dll"); 
Console.WriteLine(name.FullName); 

przeciwieństwie do rozwiązania z wykorzystaniem Assembly.Load, to nie będzie załadować do swojego zespołu AppDomain. Umożliwi to pobranie nazwy AssemblyName dla złożenia bez konieczności rozwiązywania jakichkolwiek odniesień, które ma zestaw, i bez wykonywania żadnego kodu (na przykład konstruktorów statycznych modułu) w zespole. Pozwoli to nawet uzyskać AssemblyName zestawu, który jest skierowany do wersji systemu .NET Framework, która różni się od wersji, na której działa aplikacja.

+0

Przepraszamy, to nie jest to, czego szukam. Wiem, jak to zrobić w kodzie.To, czego szukałem, to opcja linii komend, bo muszę nauczyć osobę wsparcia, jak to zrobić. Miałem nadzieję, że istnieje wbudowany cmd, który dostarczyłby mi to, co chciałem - zakończył się przetaczaniem własnych. – JMarsch

+1

Może nie było tego, czego szukał JMarsch, ale było dokładnie tym, czego chciałem! Dzięki –

+1

Bardzo przydatne w połączeniu z 'Assembly.ReflectionOnlyLoad (...)' – marsze

1

dla innej odpowiedzi, można to zrobić za pomocą PowerShell:

[System.Reflection.AssemblyName]::GetAssemblyName($PathToAssembly).FullName 

Ma to tę zaletę, że nie potrzebuje mieć zainstalowaną tylko dostać sn.exe Visual Studio, a także to, że zwraca pełną silnej nazwy dla montaż, a nie tylko token klucza publicznego.

Jest to dość łatwe do zawijania, że ​​w skrypcie z polecenia:

[CmdletBinding()] 
Param(
    [Parameter(Mandatory=$true,Position=0)] 
    $Path 
) 

Process { 
    $FullPath = [System.IO.Path]::GetFullPath($Path); 
    return [System.Reflection.AssemblyName]::GetAssemblyName($FullPath).FullName; 
}