C# 从C中引用的DLL获取正在执行的程序集名称#
从C#中引用的类库中获取正在执行的程序集的应用程序名(即MyApplication.exe)的最佳方法是什么C# 从C中引用的DLL获取正在执行的程序集名称#,c#,.net,C#,.net,从C#中引用的类库中获取正在执行的程序集的应用程序名(即MyApplication.exe)的最佳方法是什么 我需要打开应用程序的app.config以检索引用DLL的一些appSettings变量。以获取问题标题的答案: // Full-name, e.g. MyApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null string exeAssembly = Assembly.GetEntryAssembly().F
我需要打开应用程序的app.config以检索引用DLL的一些appSettings变量。以获取问题标题的答案:
// Full-name, e.g. MyApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
string exeAssembly = Assembly.GetEntryAssembly().FullName;
// or just the "assembly name" part (e.g. "MyApplication")
string exeAssemblyName = Assembly.GetEntryAssembly().GetName().Name;
正如@Ben所提到的,既然您提到想要获取配置信息,那么就使用
ConfigurationManager
类。如果您想要获取当前appdomain的配置文件,那么您需要做的就是:
ConfigurationManager.AppSettings
(当然,这需要参考System.Configuration)
要回答您的问题,您可以按照Ray所说的那样做(或者使用
Assembly.getExecutionGassembly().FullName
),但我认为使用ConfigurationManager
可以更容易地解决这个问题。您永远不应该将库与消费者耦合(在本例中为Web、WinForm或WCF应用程序)。如果您的库需要配置设置,请将其提供给库
不要对库进行编码以从使用者的配置文件中提取数据。为此提供重载构造函数(这就是它们的用途)
如果您曾经查看过ConfigurationManager.AppSettings
对象,它只是一个NameValueCollection
。因此,在库中创建一个构造函数来接受NameValueCollection
,并让消费者将该数据提供给库
//Library
public class MyComponent
{
//Constructor
public MyComponent(NameValueCollection settings)
{
//do something with your settings now, like assign to a local collection
}
}
//Consumer
class Program
{
static void Main(string[] args)
{
MyComponent component = new MyComponent(ConfigurationManager.AppSettings);
}
}
要获得没有版本等的确切名称,请使用:
string appName = Assembly.GetEntryAssembly().GetName().Name;
适用于.NET v1.1及更高版本。如果要读取(并显示)版本号:
Assembly ass = System.Reflection.Assembly.GetExecutingAssembly();
AssemblyName assname = ass.GetName();
Version ver=assname.Version;
应用程序中的某处(即Windows窗体中的标题栏)
您可以通过类类型获取程序集
typeof(MyClass).Assembly
如果您想要父EXE的名称,而不是引用的DLL程序集的名称,则需要使用:
Assembly.GetEntryAssembly().GetName().Name
这将返回EXE名称(减去.EXE部分)
根据OP的问题(第一段!),使用GetExecutionGassembly()是不正确的,因为它将返回DLL名称。对于类实例中程序集的简称:
Me.GetType ().Assembly.GetName().Name
这需要使用System.Reflection?是的,这在System.Reflection命名空间中。这是从调用中返回的:MyApplication,Version=1.0.0.0,Culture=neutral,PublicKeyToken=Null。您太好了,大约两年过去了,您编辑了您的答案以包含我的解决方案。你怎么花了这么长时间P
Assembly.GetEntryAssembly()
为ASP.net网站返回nullAssembly.getExecutionGassembly()
返回一些内容。此解决方案是否适用于asp.net应用程序?引用的类库可由WinForms和ASP.NET appsyep使用,这就是ConfigurationManager的优点。它选择适用于应用程序域的app.config/web.config。这是在.NET2.0中引入的。我刚刚用asp.NET应用程序和WinFomrs应用程序运行了一个测试,它在这两种环境下都有效。我目前正在使用WCF服务运行测试。这是我遇到的问题。这适用于ASP.NET和WinForms应用程序,但不适用于WCF服务。Assembly.getExecutionGassembly()
无法获取OP要查找的程序集Assembly.GetEntryAssembly()
Doe如果A.exe使用B.dll,而B.dll使用C.dll,如果该代码位于C.dll中会发生什么情况?仍然返回A.exe,除非A.exe处于非托管状态,或者任何dll加载到单独的AppDomain中。有关详细信息,请参阅:我在IIS中有Service.Host.dll和svcinpl.dll()服务主机。svcinpl.dll中的此代码:1)Assembly.GetEntryAssembly()获取null。2) getExecutionGassembly()获取SvcImpl。3) Assembly.GetCallingAssembly();获取System.ServiceModel。如果Assembly.GetEntryAssembly()为null,如何在SvcImpl中以编程方式获取Service.Host?
Me.GetType ().Assembly.GetName().Name