2013-09-24 51 views
1

我想使用Reflection分析T4模板內的DLL,以便可以基於反射的結果生成代碼分析。我知道EnvDTE會是一個更好的選擇,但這在我的情況下是不可能的,原因有幾個。使用反射在Visual Studio(32位)中從T4模板內分析64位DLL使用反射

與反射的問題是,該DLL是一個64位的DLL,如果我在T4模板中加載,我得到一個BadImageFormatException,因爲我試圖將一個64位DLL加載到一個32位進程(Visual Studio 2012)。

有沒有什麼辦法可以在T4中分析那個DLL的內容,最好是使用反射?

我已經想過寫,其分析DLL控制檯應用程序,將結果寫入,然後由T4模板使用的XML文件,但這並不是真正的我最喜歡的解決方案...

順便說一句:該DLL是一個託管的C++ DLL。所以Roslyn不是選擇,因爲它只支持C#和VB)。

回答

3

一件值得測試的事情是,如果加載程序集的反射只適用於你。我做了一些實驗,看來它成功地將64位程序集加載到32位進程中。它不能明顯地執行,但應該是確定的你,如果我理解正確的你:

對於全樣本來看:https://github.com/mrange/CodeStack/tree/master/q18985529/Reflect

var assembly = Assembly.ReflectionOnlyLoad ("X64"); 

var types = assembly.GetTypes(); 

foreach (var type in types) 
{ 
    Console.WriteLine (type.FullName); 

    foreach (var field in type.GetFields()) 
    { 
     Console.WriteLine (" {0} {1}", field.FieldType, field.Name); 
    } 

    foreach (var property in type.GetProperties()) 
    { 
     Console.WriteLine (" {0} {1}", property.PropertyType, property.Name); 
    } 

} 

加載了ReflectionOnly有一些缺點IIRC但有時值得。

+1

謝謝!這終於奏效!我已經在開始時嘗試過,但在轉換模板時遇到了一些錯誤。但是,在閱讀了一些關於ReflectionOnlyLoad的文檔之後,我發現需要手動加載所有相關的程序集。在我做完之後,它就像一個魅力! – gehho

+0

聽到這很棒。 – FuleSnabel