我的应用程序有一个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();
获取完整名称(包括:应用程序名称、应用程序版本、区域性、公钥令牌):
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
类的 FileVersionInfo
。希望这能帮到你。
你也可以尝试使用 Win32 API,例如 GetModuleFile()。
System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName
吗?当我偶然看到你的问题时,这正是我在寻找的。 - Bitterblue