获取继承类的物理文件名

时间:2015-11-23 09:38:23

标签: c# inheritance dll reflection

我很遗憾不得不向我已经问过的问题提出类似的问题并且已经得到了答复,但是我被困在这里并且希望有人能让我再次走上正确的道路。 (原始问题:Get DLL's file name of inherited class

我有一个名为PluginBase.dll的抽象类,其他各种类继承该类。这些都被编译为服务器应用程序的不同插件。让我们看看其中一个名为PluginMessaging.dll的插件,它有一个名为PluginMessaging.dll.config的配置文件

读取配置设置的方法在基类中,如下所示:

private void ReadConfig()
{
    _runningDir = System.IO.Path.GetDirectoryName(GetType().Assembly.Location);
    _pluginFile = System.IO.Path.GetFileName(GetType().Assembly.Location);
    _configFile = _pluginFile + ".config";

    // Do stuff here that reads from _configFile
}

将值赋给_pluginFile的代码行是我第一次提出问题时所得到的(Damien_The_Unbeliever回答)并且只要只有一个就可以正常工作PluginMessaging文件及其配置文件的实例。

我现在要做的是制作已编译插件的两个副本,让我们称之为PluginMessaging_A.dllPluginMessaging_B.dll,每个都有自己相应的配置文件, <{1}}和PluginMessaging_A.dll.config

我遇到的问题是,服务器应用程序遍历其Plugins文件夹中的所有PluginMessaging_B.dll.config个文件,实例化每个文件并为每个文件调用上面的*.dll方法。当为ReadConfig()调用该函数时,一切都按预期工作,_pluginFile的值是 PluginMessaging_A.dll 但是当PluginMessaging_A.dll函数用于DLL的第二个副本时,{{ 1}}被调用,由于某种原因,ReadConfig()再次解析为 PluginMessaging_A.dll

似乎内存中有一些表在第一次实例化时会记住PluginMessaging_B.dll的{​​{1}}信息,无论它在磁盘上有什么物理名称,并保留任何同一DLL的后续实例,尽管磁盘上的名称不同。

2 个答案:

答案 0 :(得分:1)

  

似乎内存中有一些表记住GetType()。第一次实例化PluginMessaging.dll的程序集信息,无论它在磁盘上有什么物理名称,并保留任何后续实例相同的DLL,尽管在磁盘上有不同的名称。

这种观察是正确的。文件名与程序集标识无关。

认为您正在加载两个不同的程序集,但运行时确定您尝试再次加载相同的程序集 - 并且不会加载它。

  

MSDN: Assembly Names

     

运行时在确定程序集的标识时不考虑文件名。程序集名称,版本,区域性和强名称组成的程序集标识必须清除运行时。

如果 想要从两个文件加载相同的程序集,则需要在单独的应用程序域中执行此操作。请参阅How to Load an Assembly to AppDomain with all references recursively?

或者,您可以更改名称,版本,文化或强名称并重新编译:然后您将拥有两个不同的版本。

答案 1 :(得分:-2)

尝试

_pluginFile = System.IO.Path.GetFileName(GetType().Assembly.GetExecutingAssembly().Location);
相关问题