2011-08-05 70 views
6

我有一個框架,其中包含許多基類,可以派生開發許多應用程序。在這些類中,有一個System.Windows.Forms.Panel的子類,我爲其編寫了自己的設計器。一切工作正常與Visual Studio 2005,但是當我嘗試遷移到VS2010時出了點問題。這是我做的一個大大簡化版本:Visual Studio在哪裏查找程序集?

我有一個名爲CoreClasse項目,該項目包含一個接口和兩個類:

public interface IConf 
{ 
    string foo { get; set; } 
    void InitFoo(); 
} 

public class SimpleClass 
{ 
    public string foo; 
} 

public class ConfLoader 
{ 
    public static IConf LoadConf() 
    { 
     AssemblyName anAssemblyName = new AssemblyName("ConfClasses"); 
     Assembly anAssembly = Assembly.Load(anAssemblyName); 
     IConf result = (IConf)anAssembly.CreateInstance("ConfClasses.ConfClass"); 
     result.InitFoo(); 
     return result; 
    } 
} 

然後有一個項目ConfClasses它引用CoreClasses和只包含一個類實現IConf:

public class ConfClass : IConf 
{ 
    public SimpleClass confVal; 

    public string foo 
    { 
     get { return confVal.foo; } 
     set { confVal.foo = value; } 
    } 

    public void InitFoo() 
    { 
     confVal = new SimpleClass(); 
     confVal.foo = "bar"; 
    } 
} 

終於有用於控制一個項目,只引用CoreClasses,包含面板的子類和相關設計師

[Designer("MyControls.Design.SimplePanelDesigner", typeof(IRootDesigner))] 
public class SimplePanel : Panel 
{ 
    public SimpleClass dummy = new SimpleClass(); 
} 

public class SimplePanelDesigner : DocumentDesigner 
{ 
    public IConf DesignerConf; 

    public SimplePanelDesigner() 
     : base() 
    { 
     DesignerConf = ConfLoader.LoadConf(); 
    } 
} 

現在我創建另一個引用所有這些dll幷包含SimplePanel的空子類的解決方案。當我在SolutionExplorer中雙擊此類時,將執行SimplePanelDesigner的構造函數,並調用ConfLoader的LoadConf方法。這意味着ConfClasses.dll被加載並創建一個ConfClass的實例。到目前爲止,一切正常,但是當InitFoo被調用時,會引發此異常:

無法加載文件或程序集'CoreClasses,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其中一個依賴。該系統找不到指定的文件。

爲了讓事情變得更加困難,這個例子中實際上並沒有提出異常,但這正是我真正的應用程序正在執行的結構類型,以及我得到的異常。我對這裏發生的事情一無所知。 VS正在執行一個在CoreClasses中的方法。爲什麼它試圖再次加載它?它在哪裏尋找它?我也檢查了當前的AppDomain,但它的加載程序集中包含CoreClass,並且它似乎沒有改變。

只是爲了增加一些細節,每個項目都建立在一個公共文件夾中(而不是項目文件夾中通常的obj/debug文件夾),並且在我開始的時候,PC上沒有其他的dll副本我的測試。然後,在我的userprofile的AppData \ Local \ Microsoft \ VisualStudio \ 10.0 \ ProjectAssemblies文件夾中的一系列文件夾中完成所有引用dll的副本,這似乎是VS在Assembly.Load查找程序集的地方被執行,我可以在那裏找到一個CoreClass的副本。我試圖清理所有文件夾,重建所有內容,並在各種組合中保持不同的解決方案打開/關閉,但沒有任何改進。

編輯:

由於GranMasterFlush建議,這是由異常產生的FusionLog:

=== Pre-bind state information === 
LOG: User = FCDB\fc0107 
LOG: DisplayName = XEngine.Core, Version=1.0.0.1, Culture=neutral, PublicKeyToken=null (Fully-specified) 
LOG: Appbase = file:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/ 
LOG: Initial PrivatePath = NULL 
Calling assembly : (Unknown). 
=== 
LOG: This bind starts in default load context. 
LOG: Using application configuration file: C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe.Config 
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config. 
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). 
LOG: The same bind was seen before, and was failed with hr = 0x80070002. 
ERR: Unrecoverable error occurred during pre-download check (hr = 0x80070002). 

EDIT 2

我想補充一些信息,我看了看融合日誌通過我的簡單示例生成,發現在嘗試加載CoreClasses時已生成完全相同的日誌,但VisualStudio找到了解決此問題的方法。

+0

我用[procmon](http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx)來驗證它所抱怨的文件實際上是在AppData \ Local \ Microsoft \ VisualStudio \ 11.0 \ ProjectAssemblies \ <一些臨時名稱>'。最後,這是因爲我的自定義控件試圖啓動線程('DesignMode'屬性不起作用,請參閱[此解決方案](http://stackoverflow.com/questions/39648/good-way-to-debug - 視覺工作室設計師-錯誤))。我通過研究[本文](http://msdn.microsoft.com/en-us/library/ms996457.aspx)瞭解如何調試設計時行爲。 – pelesl

回答

4

我剛剛發現了什麼情況。簡單的例子和​​真實的事物之間的區別是有一個AddIn涉及的事實。 這是一個很有趣的故事,但就是這樣。
從代碼示例中可以看到,我通過反射來加載ConfClasses dll,以避免添加對它的引用。這在運行時很好,但設計者抱怨說它無法將IConf投射到IConf。發生這種情況是因爲CoreClasses.dll從設計器啓動時從AppData \ Local \ Microsoft \ VisualStudio \ 10.0 \ ProjectAssemblies加載,但ConfClasses.dll從我的bin文件夾加載,所以它的引用也是如此,因此有兩個版本的CoreClasses.dll和不同版本的IConf。

爲了避免這個問題,我開發了一個AddIn,當在設計時使用Assembly.Load加載程序集時,添加對該程序集的引用,然後在最後一個設計器窗口關閉時清除引用。

VS2005一切正常,但使用ProcMon.exe我發現VS2010添加了一個新的文件夾,其中插件查找程序集:Program Files(x86)\ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ CommonExtensions \ DataDesign
我在那裏複製了我的程序集,一切都恢復正常。現在只需要找一種手動添加東西的方法。

2

您是否嘗試過使用程序集綁定日誌查看器來調查爲什麼這個失敗加載程序集?

http://msdn.microsoft.com/en-us/library/e74a18c4%28v=vs.71%29.aspx

這裏有另一篇文章中有關使用它:

http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57120.aspx

編輯:

當存儲在DLL的?這個forum post詳細描述了一個類似的問題,問題在於DLL被引用的不在GAC,可執行目錄或可執行目錄中的子文件夾中:

+0

我在FusionLog中添加了這個問題,但對我來說沒什麼意義...... –

+0

我的所有項目都有一個文件夾設置爲輸出路徑,所以所有的dll都在同一個文件夾中,顯然不是Visual Studio之一。程序集不是從該文件夾加載的,而是從AppData \ Local \ Microsoft \ VisualStudio \ 10.0 \ ProjectAssemblies子文件夾中創建的副本,在這裏我可以找到它們。 –

相關問題