42

我的应用程序有一个 exe 并使用一些 DLL。我全部用 C# 编写。

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

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

4

5 回答 5

90

获取应用名称:

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;
于 2013-02-12T23:12:51.000 回答
23

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

此函数将提供加载其他库的应用程序版本。

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

这将给出当前库的版本。如果您在应用程序库中调用它,您将获得应用程序版本,如果在 DLL 中调用它,则将获得该 DLL 版本。

所以在我看来System.Reflection.Assembly.GetEntryAssembly().GetName().Version; 是正确的功能使用。

于 2014-11-19T05:07:28.860 回答
16

如果您想创建一个组件 (.dll) 用于另一个应用程序引用以获取主应用程序名称和版本,您可以使用以下方式:

获取主应用名称:

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

获取版本:

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

获取 FullName(包含:应用名称、应用版本、文化、publicKeyToken):

AppDomain.CurrentDomain.DomainManager.EntryAssembly.FullName;

但是在这个解决方案中存在一个问题,它取决于主机,如果它直接从可执行文件运行,则会发生错误。因此进行以下选举:

获取主应用名称:

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

获取版本:

System.Windows.Forms.Application.ProductVersion;
于 2014-11-04T08:51:14.267 回答
0

这对我有用

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

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

于 2021-12-13T19:21:57.520 回答
-6

您可以尝试使用FileInfoClass吗FileVersionInfo?希望这会有所帮助..

您还可以尝试 Win32 API,例如 GetModuleFile()

于 2013-02-12T09:58:48.387 回答