Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C中引用的DLL获取正在执行的程序集名称#_C#_.net - Fatal编程技术网

C# 从C中引用的DLL获取正在执行的程序集名称#

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

从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().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网站返回null
Assembly.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