2013-02-12 13 views
16

Meine Anwendung hat eine EXE und verwendet einige DLLs. Ich schreibe alles in C#.So erhalten Sie den Namen und die Version der EXE-Anwendung in C# Compact Framework

In einer DLL möchte ich eine Methode schreiben, um den Anwendungsnamen und die Version von der Versionsinformation in der exe zu erhalten.

Ich verstehe, dass ich in vollem .NET GetEntryAssembly verwenden konnte, aber das ist in CF nicht verfügbar.

+0

Haben Sie versucht, 'System.Diagnostics.Process.GetCurrentProcess(). MainModule.ModuleName'? Das war, was ich gesucht habe, als ich auf deine Frage gestoßen bin. – Bitterblue

+0

@ mini-me Es ist zu lange her, um sich daran zu erinnern – cja

Antwort

43

gibt es die App-Name:

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

die Version Anfahrt:

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

Vielleicht möchten Verwenden Sie GetCallingAssembly() oder erhalten Sie die Assembly nach Typ (z. B. typeof(Program).Assembly), wenn Ihre DLL versucht, die EXE-Version zu erhalten, und Sie nicht sofortigen Zugriff darauf haben.

EDIT

Wenn Sie eine DLL und Sie müssen den Namen der ausführbaren Datei haben Sie ein paar Optionen, auf den Anwendungsfall abhängig. Sie können die Assembly von einem Typ abrufen, der in der EXE-Assembly enthalten ist. Da die DLL jedoch selten auf die EXE verweist, erfordert sie die EXE-Übergabe in einem Objekt dieses Typs.

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

Sie könnten auch ein bisschen ein Ende laufen wie folgt tun:

[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

Sind Sie sicher, das wird im Compact Framework funktionieren? –

+0

GetExecutingAssembly() ruft den Namen der DLL ab, von der es aufgerufen wird. Ich möchte den Namen der exe. – cja

+0

GetCallingAssembly() ist komplizierter und kann zu unerwarteten Ergebnissen führen. – cja

-2

Können Sie versuchen, FileInfo Klasse FileVersionInfo zu verwenden. Hoffe, dass dies helfen wird ..

Sie können auch versuchen, Win32-API wie GetModuleFile()

+1

Bitte fügen Sie Beispielcode – cja

+0

hinzu Überprüfen Sie msdn für Beispiele. –

+5

Einer von uns versteht nicht, wie StackOverflow funktioniert – cja

2

Wenn Sie eine Komponente (DLL) verwenden, um eine andere App Verweis erstellen möchten, um den Haupt holen App-Name und Version können Sie auf diese Weise verwenden:

gibt es die Haupt-App-Name:

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

gibt es die Version:

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

Erste das Fullname (enthalten: Name der App, App-Version, Kultur, PublicKeyToken):

AppDomain.CurrentDomain.DomainManager.EntryAssembly.FullName; 

Aber in dieser Lösung gibt es ein Problem, das, dass, abhängig von dem Host und wenn Es wird direkt von der ausführbaren Datei ausgeführt, der Fehler tritt auf. Deshalb sind die folgenden Wahlen:

gibt es die wichtigsten Namen App:

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

gibt es die Version:

System.Windows.Forms.Application.ProductVersion; 
14

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

Diese Funktion Version von Application, von wo aus anderen Bibliotheken geben sind geladen.

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

Dies wird Version der aktuellen Bibliothek geben. Wenn Sie dies in der Anwendungsbibliothek aufrufen, erhalten Sie eine Anwendungsversion, und wenn Sie diese in einer DLL aufrufen, dann wird diese DLL-Version erhalten.

Also meiner Meinung nach System.Reflection.Assembly.GetEntryAssembly().GetName().Version; ist aktuelle Funktion zu verwenden.

Verwandte Themen