获取动态加载的程序集

时间:2017-01-19 18:35:46

标签: c# .net .net-assembly

说我有一个应用程序:C:\ MyPrograms \ App.exe

此应用不会引用library.dll。 App.exe可以动态加载程序集。

让我们说DLL的路径是C:\ MyPrograms \ DLLs \ library.dll

无论我尝试过什么,我都可以获得执行程序集(App.exe)的路径。

GetExecutingAssembly()

GetEntryAssembly()

AppDomain.CurrentDomain.BaseDirectory

有没有办法获取动态加载的DLL的位置?一切只是返回,例如,App.exe的位置

编辑1: 改写OP ......

MyApp.exe可以通过传递DLL的路径来调用任何DLL。此DLL可以是用户删除它的任何位置。排除硬编码路径或类似的东西。

我想要做的是能够获取动态加载的DLL的当前位置。即为了处理错误,我希望能够将错误日志写入DLL所在的目录。

我发现并尝试了一些方法来获取加载的DLL所在的位置,但这会返回CALLING程序集的目录(MyApp.exe)或者根本不返回任何内容。

2 个答案:

答案 0 :(得分:3)

void类具有属性System.Reflection.Assembly,它获取包含清单的已加载文件的路径或UNC位置。所以,例如,如果您以这种方式加载程序集

Location

var assembly = System.Reflection.Assembly.Load(@"<assembly name>"); 将返回您的要求。

回答编辑1 :为了做到这一点

  

处理错误,我希望能够将错误日志写入   DLL所在的目录

你可以

  1. Load an assembly to app domain并订阅AppDomain.UnhandledException,您可以在其中放置错误记录代码。此代码将知道当前域及其基本目录。
  2. 在调用汇编方法时在程序集路径中传递某种上下文,并在记录逻辑中使用它。如果只在一个线程中调用汇编方法,它可以是线程上下文。

答案 1 :(得分:0)

如果你在动态加载的程序集中,你已经定义了一个名为MyDynLoadObject的类,你可以这样做:

Assembly assem = Assembly.GetAssembly(typeof(MyDynLoadObject));

编辑:另一种方法:

public class MyDynLoadObject
{
    public MyDynLoadObject()
    {

      Assembly assem = this.GetType().Assembly;

    }
}