2010-03-29 26 views
0

我在Visual Studio 2008中設置了以下問題:包含入口點Main()方法類和聲明接口的父項目以及具有實現在父項目中聲明的接口的類。可執行文件和程序集的Visual Studio 2008項目組織

我已指定Parent的輸出類型是控制檯應用程序,而Child的輸出類型是類庫。在Child中,我將Parent的引用添加爲項目,並指定Child取決於Parent,並且構建順序應該是Parent,然後是Child。

構建成功,據我所知,正確的事情顯示在Child/bin/debug目錄中:Parent.exe和Child.dll。

但是,如果我跑Parent.exe,然後在點時,它應該載入從Child.dll一類,它失敗,出現錯誤消息:

例外執行操作System.TypeLoadException:無法加載從程序集'Parent,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'中鍵入'Child.some.class'。

我想我很困惑如何讓父項目和子項目一起玩。我計劃讓更多的子項目使用與Parent相同的框架,因此我不想將入口點類下移到Child項目中。如果我試圖指定Child項目也是一個Console應用程序,那麼構建過程將失敗,因爲子項中沒有Main()入口點類(即使Parent項目作爲引用包含在其中)。

任何幫助將受到歡迎!謝謝,馬丁

回答

0

您希望避免循環依賴。

如果您希望保持界面和實現獨立,那麼在由「子」程序集(類庫)使用的第三個程序集(類庫)中定義接口,然後同時使用接口和實現應用。

2

通常你想扭轉你的層次結構:你的.exe項目應該取決於你的衛星組裝項目(你叫「孩子」)。然後,要使用衛星程序集中的類型,您需要將.exe項目的引用添加到組裝項目中。通過右鍵單擊VS的解決方案資源管理器中的.exe項目,然後執行添加引用來執行此操作...單擊項目選項卡並選擇程序集項目。

編輯: 如果你想爲整個項目設置一個「框架」(通過定義interfaces或基類),那麼我將在單個核心程序集中開始這樣做;把這些定義放在像MyProject.Core.dll這樣的東西里。然後你的「實現」項目/程序集將引用你的MyProject.Core項目。綜上所述,你可能會尋找類似於IOC/DI框架的東西。請參閱Ninject,StructureMap,Castle Windsor等。

0

因此,在回答自己的問題的優良傳統中,我研究出爲了成功調用GetType(),我必須指定正確的程序集。每個項目都編譯成其自己的程序集(Application.exe,Interface.dllImplementation.dll)。因此,爲了實例化Application Main()類中實現類,我得叫:

Type actionType = Type.GetType("ImplementationClass", "Implementation", true); 

這似乎有點做作,但至少它的工作原理。

相關問題