我的应用程序有一个 exe 并使用一些 DLL。我全部用 C# 编写。
在一个 DLL 中,我想编写一种方法来从 exe 中的版本信息中获取应用程序名称和版本。
我知道在完整的 .NET 中我可以使用 GetEntryAssembly,但这在 CF 中不可用。
我的应用程序有一个 exe 并使用一些 DLL。我全部用 C# 编写。
在一个 DLL 中,我想编写一种方法来从 exe 中的版本信息中获取应用程序名称和版本。
我知道在完整的 .NET 中我可以使用 GetEntryAssembly,但这在 CF 中不可用。
获取应用名称:
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;
System.Reflection.Assembly.GetEntryAssembly().GetName().Version;
此函数将提供加载其他库的应用程序版本。
System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
这将给出当前库的版本。如果您在应用程序库中调用它,您将获得应用程序版本,如果在 DLL 中调用它,则将获得该 DLL 版本。
所以在我看来System.Reflection.Assembly.GetEntryAssembly().GetName().Version;
是正确的功能使用。
如果您想创建一个组件 (.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;
这对我有用
var versionInfo = FileVersionInfo.GetVersionInfo(AppDomain.CurrentDomain.BaseDirectory + AppDomain.CurrentDomain.FriendlyName);
string version = versionInfo.FileVersion;
这将获取当前正在运行的 EXE 的版本,无论是否从 DLL/其他链接项目等调用此字符串
您可以尝试使用FileInfo
Class吗FileVersionInfo
?希望这会有所帮助..
您还可以尝试 Win32 API,例如 GetModuleFile()