2013-02-12 13 views
16

La mia applicazione ha un exe e utilizza alcune DLL. Sto scrivendo tutto in C#.Come ottenere il nome dell'applicazione e la versione di Exe in C# Compact Framework

In una DLL, desidero scrivere un metodo per ottenere il nome dell'applicazione e la versione dalle informazioni sulla versione nel file exe.

Comprendo che in .NET completo potrei usare GetEntryAssembly, ma quello non è disponibile in CF.

+0

Hai provato 'System.Diagnostics.Process.GetCurrentProcess(). MainModule.ModuleName'? Era quello che ** I ** cercava quando sono incappato nella tua domanda. – Bitterblue

+0

@ mini-me È troppo tempo fa per ricordare – cja

risposta

43

Ottenere il nome dell'applicazione:

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

Come controllare la versione:

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

si potrebbe desiderare utilizzare GetCallingAssembly() o ottenere l'assembly per tipo (ad esempio typeof(Program).Assembly) se la DLL sta cercando di ottenere la versione EXE e non si ha accesso immediato ad essa.

EDIT

Se si dispone di una DLL ed è necessario il nome del file eseguibile avete alcune opzioni, a seconda del caso d'uso. È possibile ottenere l'assembly da un tipo contenuto nell'assembly EXE, ma poiché sarebbe raro che la DLL faccia riferimento all'EXE, richiede il passaggio EXE in un oggetto di quel tipo.

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

Si potrebbe anche fare un po 'di una soluzione end-correre come questo:

[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

sei sicuro, questo funzionerà in quadro compatto? –

+0

GetExecutingAssembly() otterrà il nome della DLL da cui viene chiamato. Voglio il nome dell'exe. – cja

+0

GetCallingAssembly() è più complicato e può avere risultati imprevisti. – cja

-2

Si può provare a utilizzare FileInfo Classe FileVersionInfo. Spero che questo vi aiuterà ..

Si può anche provare API Win32 come GetModuleFile()

+1

Si prega di aggiungere il codice di esempio – cja

+0

Controllare msdn per i campioni. –

+5

Uno di noi non capisce come funziona StackOverflow – cja

2

Se si desidera creare un componente (DLL) utilizzare per un altro riferimento app per prendere il principale nome dell'applicazione e la versione, è possibile utilizzare in questo modo:

Ottenere il nome dell'applicazione principale:

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

Come controllare la versione:

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

Ottenere il FullName (contengono: nome dell'applicazione, la versione app, la cultura, publicKeyToken):

AppDomain.CurrentDomain.DomainManager.EntryAssembly.FullName; 

Ma in questa soluzione c'è un problema, questo, che, dipende sull'host e se viene eseguito direttamente dal file eseguibile, si verificherà l'errore. quindi le seguenti elezioni:

Come il nome dell'applicazione principale:

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

Come controllare la versione:

System.Windows.Forms.Application.ProductVersion; 
14

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

Questa funzione darà versione dell'applicazione dalle quali altre biblioteche sono caricati

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

Questo darà versione della libreria corrente. Se lo chiami nella libreria dell'applicazione otterrai la versione dell'applicazione e se la chiamerai in una DLL otterrà la versione DLL.

Quindi a mio parere System.Reflection.Assembly.GetEntryAssembly().GetName().Version; è la funzione di currect da utilizzare.

Problemi correlati