2017-03-09 102 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