我有一個框架,其中包含許多基類,可以派生開發許多應用程序。在這些類中,有一個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找到了解決此問題的方法。
我用[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