【问题标题】:Get Assembly Location of Referenced Method获取引用方法的组装位置
【发布时间】:2017-03-21 15:51:38
【问题描述】:

我有一个被主应用程序引用的 DLL。当我从 DLL 调用方法时,我需要从 DLL 特定的 app.config 文件中读取配置。但是,当我将配置管理器映射到所需的配置文件时,我注意到 GetExecutingAssembly() 返回主应用程序的程序集而不是引用的 DLL。使用 DLL 时,有没有办法准确获取 DLL 程序集位置?当然,我想更新我的 DLL,以便它在执行时总是返回自己的 assebmlylocation。

ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = Assembly.GetExecutingAssembly().Location);
Configuration libConfig = ConfigurationManager.OpenMappedExeConfiguration(
       map, ConfigurationUserLevel.None);

【问题讨论】:

  • 在 dll 中有一个方法返回 MethodBase.GetCurrentMethod().DeclaringType.Assembly?
  • @stuartd 这不太可能有帮助 - 帖子中显示的代码做了同样的事情,并且可以正常工作如果通过 DLL 中的方法执行(与您的示例相同) .目前尚不清楚 OP 需要在哪里运行此代码 - 所以任何回答的人都需要提供多个选项(包括 GAC 安装和影子复制案例)
  • @AlexeiLevenkov 好点,谢谢

标签: c# dll configuration mapping .net-assembly


【解决方案1】:

你需要使用反射来获得它。有 GetAssembly 方法返回包含传递类型的程序集。

例子:

string s = Assembly.GetAssembly(typeof(MemoryStream)).CodeBase;

返回 mscorlib.dll 的路径:

"file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll"

【讨论】:

  • 这是一件好事,但它仍然返回主应用程序文件夹中 DLL 本地副本的路径。我需要的是最初导入 DLL 的路径以及特定于 DLL 的配置文件所在的路径。在主解决方案中添加对 DLL 的引用时,是否有另一种方法来获取 DLL 的配置?
  • @KarenGumerov 为什么不将配置文件也复制到应用程序的 bin 目录中?程序集不知道它可能被复制的位置的任何东西,在您的情况下,它是从中编译的项目,包括配置文件..
  • 这就是解决方案。谢谢。
【解决方案2】:

为什么您的程序集需要配置文件?通常您所做的是配置应用程序,而不是。因此,程序 A 的用户可能拥有这些设置,而程序 B 的用户拥有这些设置,但是两个程序可能使用相同的引用程序集。

无论如何,如果您真的必须这样做,您可以使用 MethodBase.GetCurrentMethod() 获取您当前所在的引用程序集的位置:

string assemblyPath = MethodBase.GetCurrentMethod().DeclaringType.Assembly.Location;
Configuration libConfig = ConfigurationManager.OpenExeConfiguration(
   assemblyPath);

【讨论】:

    猜你喜欢
    • 2013-11-05
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2016-04-07
    • 2011-09-05
    • 1970-01-01
    相关资源
    最近更新 更多