2014-12-23 92 views
2

我試圖將新的dll添加到我的應用程序中。在不重新啓動應用程序的情況下添加對asp.net mvc應用程序的dll引用

我總是得到了同樣的錯誤,當我嘗試訪問到一個控制器,是在新的DLL:

​​

我已經嘗試使用:我一直在使用Ninject嘗試

Compilation Error 
Compiler Error Message: CS0246: The type or namespace name 'App2' could not be found (are  you missing a using directive or an assembly reference?) 
Line 26:  using System.Web.Optimization; 
Line 27:  using System.Web.Routing; 
Line 28:  using App2.Plugin; 
Line 29:  
Line 30:  

Source File: c:\Users\wilhem\AppData\Local\Temp\Temporary ASP.NET Files\root\0c41d57d\e08d7bc3\App_Web_index.cshtml.244a139d.hzhandta.0.cs Line: 28 

我正在實施像一個基於插件的體系結構,我希望能夠在不重新啓動應用程序的情況下添加新的dll。有關上述代碼的任何想法?

回答

3

您可以隨時加載程序集。但不要把它放在你的應用程序的/bin目錄中。 將它放在另一個位置,如/plugins。不要讓它公開可見。

創建一個公共接口,其中以前知道,與功能如IMyInterface.DoStuff()並返回一個字符串,無論如何。

然後你可以使用反射來稱呼它:

Assembly assembly = Assembly.LoadFrom(Server.MapPath("~/plugins/myDll.dll")); 
Type type = assembly.GetType("MyClass"); 
object instanceOfMyType = Activator.CreateInstance(type); 

確保你的MyClass的實現你的黎民IMyInterface。 您將無法看到像你的類:

MyClass obj = new MyClass(); 

這將重置您的ASP.NET應用程序。 但與反思,你就可以做這樣的事情:

string myReturn = ((IMyInterface)instanceOfMyType).DoStuff(); 
+0

我的DLL是內部有一個控制器asp.net的MVC應用程序。我正在建立控制器工廠並註冊所有這些東西。我可以使用BuildManager.AddReferencedAssembly(MyDll)實現此目的,但此方法只能在PreApplicationStartMethod中使用,即使嘗試使用Ninject也會出現相同的錯誤。我不想直接調用任何方法,我只想引用我的dll到我的mvc主應用程序。 – willver

+0

有沒有重新啓動MVC應用程序的主要原因?如果你添加新的視圖到你的應用程序,我不明白你爲什麼不能重置它。即使插件技術有時也需要應用程序重新啓動才能連接某些事件。也沒有辦法編譯一個在編譯時不知道的類!我如何說,你需要通過加載的dll創建接口和路由信息,因爲這將在編譯時知道。 – rodrigogq

+0

我明白你在說什麼,我已經創建了所有的結構,路由,接口等......重新啓動應用程序的問題是,我將在應用程序中丟失會話,也許我應該像維護任務一樣創建並重新啓動應用程序在添加新插件之後的一大早。但我更喜歡在不重新啓動主應用程序的情況下添加一個插件,我可以將新鏈接添加到主應用程序的索引頁面中,而無需重新啓動。 – willver

相關問題