2013-02-12 22 views
16

Moja aplikacja ma plik exe i korzysta z niektórych bibliotek DLL. Piszę wszystko w języku C#.Jak uzyskać nazwę i wersję aplikacji exe w C# Compact Framework

W jednej DLL chcę napisać metodę, aby uzyskać nazwę aplikacji i wersję z informacji o wersji w exe.

Rozumiem, że w pełnym .NET mogę używać GetEntryAssembly, ale to, co jest niedostępne w CF.

+0

Czy próbowałeś 'System.Diagnostics.Process.GetCurrentProcess(). MainModule.ModuleName'? Tego właśnie szukałem **, kiedy natknąłem się na twoje pytanie. – Bitterblue

+0

@ mini-me Zbyt dawno temu należy pamiętać – cja

Odpowiedz

43

Pierwsze nazwę aplikacji:

System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; 

Pierwsze wersję:

System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; 

może chcesz do użycia GetCallingAssembly() lub pobrania zestawu według typu (np. typeof(Program).Assembly), jeśli twoja biblioteka DLL próbuje uzyskać wersję EXE i nie masz natychmiastowego dostępu do niej.

EDIT

Jeśli masz DLL i trzeba nazwę pliku wykonywalnego masz kilka opcji, w zależności od przypadku użycia. Możesz uzyskać Assembly z typu zawartego w zbiorze EXE, ale ponieważ DLL będzie rzadko odwoływał się do EXE, wymaga to podania EXE w obiekcie tego typu.

Version GetAssemblyVersionFromObjectType(object o) 
{ 
    o.GetType().Assembly.GetName().Version; 
} 

Można również zrobić trochę koniec prowadzony tak:

[DllImport("coredll.dll", SetLastError = true)] 
private static extern int GetModuleFileName(IntPtr hModule, StringBuilder lpFilename, int nSize); 

... 

var name = new StringBuilder(1024); 
GetModuleFileName(IntPtr.Zero, name, 1024); 
var version = Assembly.LoadFrom(name.ToString()).GetName().Version; 
+0

jesteś pewien, że to będzie działać w środowisku Compact? –

+0

GetExecutingAssembly() otrzyma nazwę biblioteki DLL, z której jest wywoływana. Chcę nazwę exe. – cja

+0

Metoda GetCallingAssembly() jest bardziej skomplikowana i może mieć nieoczekiwane wyniki. – cja

-2

Czy możesz spróbować użyć klasy FileInfo Class FileVersionInfo. Nadzieję, że to pomoże ..

Możesz także spróbować Win32 API jak GetModuleFile()

+1

Proszę dodać przykładowy kod – cja

+0

Sprawdź msdn dla próbek. –

+5

Jeden z nas nie rozumie, jak działa StackOverflow – cja

2

Jeśli chcesz utworzyć komponent (.dll) stosowanie w odniesieniu do innej aplikacji do pobrania głównym nazwa i wersja aplikacji, można użyć w ten sposób:

Uzyskiwanie główną nazwę aplikacji:

AppDomain.CurrentDomain.DomainManager.EntryAssembly.GetName().Name; 

Pierwsze wersję:

AppDomain.CurrentDomain.DomainManager.EntryAssembly.GetName().Version.ToString();  

Pierwsze FullName (zawierać: nazwę aplikacji, wersję aplikacji, kultura, TokenKluczaPublicznego):

AppDomain.CurrentDomain.DomainManager.EntryAssembly.FullName; 

Ale w tym roztworze jest problem, to, że jest uzależniony od gospodarza, a jeśli uruchamia się bezpośrednio z pliku wykonywalnego, wystąpi błąd. więc następujących wyborów:

dojazd główną nazwę aplikacji:

string appName = AppDomain.CurrentDomain.FriendlyName; 
appName = appName.Substring(0, appName.IndexOf('.')); 

Pierwsze wersję:

System.Windows.Forms.Application.ProductVersion; 
14

System.Reflection.Assembly.GetEntryAssembly().GetName().Version;

Funkcja ta daje wersja aplikacji skąd innych bibliotek są załadowane.

System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;

To da wersję bieżącej biblioteki. Jeśli wywołasz to w bibliotece aplikacji, otrzymasz wersję aplikacji i jeśli wywołasz to w bibliotece DLL, otrzymasz wersję DLL.

Tak więc, moim zdaniem, System.Reflection.Assembly.GetEntryAssembly().GetName().Version; jest prawidłową funkcją do użycia.