【问题标题】:How to get exe application name and version in C# Compact Framework如何在 C# Compact Framework 中获取 exe 应用程序名称和版本
【发布时间】:2013-02-12 09:51:54
【问题描述】:

我的应用程序有一个 exe 并使用一些 DLL。我都是用 C# 写的。

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

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

【问题讨论】:

  • 你试过System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName 吗?当我偶然发现你的问题时,这就是 正在寻找的内容。
  • @mini-me 太久远记不住了
  • @Bitterblue System.Diagnostics.Process.GetCurrentProcess().MainModule 在 CF 中不可用。

标签: c# compact-framework versioning


【解决方案1】:

获取应用名称:

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;

【讨论】:

  • GetExecutingAssembly() 将获取调用它的 DLL 的名称。我想要exe的名称。
  • GetCallingAssembly() 更复杂,可能会产生意想不到的结果。
  • 请解释“按类型获取程序集(例如 typeof(Program).Assembly)”
【解决方案2】:

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

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

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

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

所以在我看来System.Reflection.Assembly.GetEntryAssembly().GetName().Version; 是当前使用的函数。

【讨论】:

  • GetExecutingAssembly() 在 Compact Framework 中不可用!
【解决方案3】:

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

获取主应用名称:

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

获取版本:

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

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

AppDomain.CurrentDomain.DomainManager.EntryAssembly.FullName;

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

获取主应用名称:

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

获取版本:

System.Windows.Forms.Application.ProductVersion;

【讨论】:

  • 我认为这个答案没有得到足够的信任。
【解决方案4】:

您可以尝试使用FileInfoFileVersionInfo。希望这会有所帮助..

你也可以试试 GetModuleFile() 之类的 Win32 API

【讨论】:

  • 你想在这里说什么?
  • 我支持 cja。有这样的答案的代码示例是最有帮助的。
【解决方案5】:

这对我有用

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 2011-04-18
    • 1970-01-01
    相关资源
    最近更新 更多