在动态加载程序集时更改命名空间

时间:2017-03-09 12:20:20

标签: c# dynamic

我有一个应用程序,它在分隔的dll中使用特定类型(由其他人开发)。 说它是InnerType:

namespace SeparatedAssembly
{
   public class InnerType 
   {

   }
}

到目前为止,我在Visual Studio中引用了这个dll的一个版本,我在我的应用程序中使用了InnerType。但是,由于InnerType中的代码可能会更改,因此程序集在运行时使用" AssemblyResolve"事件

但是现在,这个类的命名空间发生了变化:

namespace SeparatedAssembly.Inner
{
   public class InnerType
   {

   }
}

所以,我有一个异常TypeLoadException,因为我的应用程序不能再找到这种类型了。我无法引用这个新版本并更改我使用的命名空间,因为它与此dll的旧版本兼容。

所以我的问题是:甚至可以在AssemblyResolve事件中指定要在程序集中查找的命名空间吗? 如果有办法捕获此异常并尝试使用不同的命名空间,那也可以。

感谢。

1 个答案:

答案 0 :(得分:1)

不,要调用的方法的全名在调用程序集中指定,并且您不能以简单的方式“重写”它。命名空间是名称的一部分。我将参考我前一段时间给出的另一个回复:Is C# namespace compiled into IL files to be “complete” names?

举例来说TryRoslyn

^

被翻译为

$

(名称空间namespace Foo { public class Bar { public void Zoo() { Console.WriteLine("Hello"); } } } 直接是名称.class public auto ansi beforefieldinit Foo.Bar extends [mscorlib]System.Object {

的一部分

然后调用Foo的方法是:

Foo.Bar