2017-03-09 93 views
0

我有一个应用程序在分离的dll(由其他人开发)中使用特定类型。 说它是InnerType:在动态加载程序集上更改名称空间

namespace SeparatedAssembly 
{ 
    public class InnerType 
    { 

    } 
} 

到现在为止,我在Visual Studio中引用一个版本的这个dll的,我用的是InnerType在我的应用程序。但是,由于InnerType中的代码可能会更改,因此程序集将在运行时通过“AssemblyResolve”事件加载。

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

namespace SeparatedAssembly.Inner 
{ 
    public class InnerType 
    { 

    } 
} 

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

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

谢谢。

回答

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的一部分)

,然后方法调用Console.WriteLine是:

call void [mscorlib]System.Console::WriteLine(string) 
+0

即使答案是否定的,这很有帮助。谢谢。 – Jonyjack

+0

@Jonyjack我对你的问题给了一些想法,我看不到一个简单的解决方案,甚至不是一个简单的解决方案。你可以创建一些shim类(一个用于旧的.dll,一个用于新的.dll),并从一个通用接口派生出这两个Shim类(然后在你的代码中只使用这个通用接口),但取决于你做与dll的对象可能是非常困难的。 – xanatos