如何在C#紧凑框架中获取exe应用程序名称和版本

46

我的应用程序有一个exe文件并使用一些DLL文件。我用C#写所有的东西。

在其中一个DLL中,我想编写一个方法来从exe版本信息中获取应用程序名称和版本。

我知道在完整的.NET中我可以使用GetEntryAssembly,但在CF中不可用。


1
你尝试过 System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName 吗?当我偶然看到你的问题时,这正是我在寻找的。 - Bitterblue
@mini-me 这已经是太久远的事,记不得了。 - cja
@Bitterblue System.Diagnostics.Process.GetCurrentProcess().MainModule在CF中不可用。 - Behzad Ebrahimi
5个回答

94

获取应用程序名称:

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

获取版本信息:

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

如果你的 DLL 想要获取 EXE 版本,而且你无法立即访问它,那么你可能需要使用 GetCallingAssembly() 或者通过类型获取程序集(例如 typeof(Program).Assembly)。

编辑

如果你有一个 DLL,需要获取可执行文件的名称,则根据用例情况有几个选项。你可以通过包含在 EXE 程序集中的类型获取程序集,但由于 DLL 很少引用 EXE,因此需要 EXE 传递该类型的对象。

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

你也可以这样绕个弯:

[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;

1
GetExecutingAssembly() 将获取调用它的 DLL 的名称。我想要的是 exe 的名称。 - cja
GetCallingAssembly() 更加复杂,并且可能产生意料之外的结果。 - cja
请解释“通过类型获取程序集(例如typeof(Program).Assembly)”。 - cja

26

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

这个函数将返回加载其他库的应用程序版本。

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

这将返回当前库的版本。如果在应用程序库中调用此函数,您将获得应用程序版本,如果在DLL中调用,则会获得该DLL的版本。

因此,在我看来,System.Reflection.Assembly.GetEntryAssembly().GetName().Version; 是要使用的正确函数。


1
在紧凑框架中无法使用GetExecutingAssembly()! - Behzad Ebrahimi

18

如果你想创建一个组件(.dll),并在另一个应用程序中使用它,需要引用主应用程序的名称和版本号,可以按照以下方式进行操作:

获取主应用程序的名称:

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

获取版本信息:

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

获取完整名称(包括:应用程序名称、应用程序版本、区域性、公钥令牌):

AppDomain.CurrentDomain.DomainManager.EntryAssembly.FullName;

但是这个解决方案存在一个问题,它依赖于主机,如果直接从可执行文件中运行,将会出现错误。 因此有以下选择:

获取主应用程序名称:

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

获取版本信息:

System.Windows.Forms.Application.ProductVersion;

5
我认为这个答案没有得到足够的认可。 - Arvo Bowen

-1

这对我有用

var versionInfo = FileVersionInfo.GetVersionInfo(AppDomain.CurrentDomain.BaseDirectory + AppDomain.CurrentDomain.FriendlyName);
string version = versionInfo.FileVersion;

这将获取当前运行的EXE版本,无论此字符串是从DLL /其他链接的项目中调用的


不要理会,有更好的方法。例如Application.AssemblyName等。 - WiiLF

-6

你可以尝试使用 FileInfo 类的 FileVersionInfo。希望这能帮到你。

你也可以尝试使用 Win32 API,例如 GetModuleFile()。


你想要表达什么? - Rajesh Subramanian
6
我赞同cja的观点。像这样附带代码示例的答案最有帮助。 - Daved

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接