2016-05-03 25 views
0

調用匯編項目名稱我有MyAwesomeProject其中進口MyAwesomeLogger並調用它:獲取MVC5

using MyAwesomeLogger; 
using System.Web.Mvc; 

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var Logger = new LogFactory.GetLogger(); 
     Logger.Debug("Hello World"); 

     return View(); 
    } 
} 

LogFactory.GetLogger()方法是內部MyAwesomeLogger和所有美好的事物它的一部分,是將記錄器的文件名。我的主要問題是我需要獲取項目名稱並將其設置爲日誌文件名稱,並且這必須適用於控制檯應用程序和Web應用程序。

我之前嘗試做的是:Assembly.GetEntryAssembly().GetName().Name;雖然這適用於控制檯應用程序,但它不適用於Web。我經歷了很多鏈接,但大多數解決方案都顯示如何從mvc項目本身獲取項目名稱,而不是像這樣的dll。什麼是最簡單的傻瓜證明方式來做到這一點?

我想另一件事是:

var type = System.Web.HttpContext.Current.ApplicationInstance.GetType(); 
while (type != null && type.Namespace == "ASP") 
{ 
    type = type.BaseType; 
} 

var fileName = type.Assembly.GetName().Name; 

上述工作,如果我把它在HomeController的,但MyAwesomeLogger不知道HttpContext的,所以我不能把它那裏。

+0

請注意,項目名稱並未在程序集中的任何位置持久化 - 因此您可能很難嘗試獲取某個程序... –

+0

您可以嘗試Assembly.GetExecutingAssembly()。但是,這可能會產生奇怪的結果(如果你在cshtml中調用它,你可能會得到預編譯頁面的dll等等),你可能會嘗試Assembly.GetCallingAssembly()? – apr

+0

? [鏈接](http://stackoverflow.com/questions/5478814/c-sharp-get-calling-methods-assembly) – apr

回答

0

項目的名稱不一定在項目的dll中。項目的DLL可以是任何名稱,它不必與Visual Studio中的項目文件的名稱相匹配。所以這通常是獲取項目名稱的不好方法。

您可以在應用程序選項卡上的項目設置中的DLL上設置組裝信息。

標題將是dll的名稱「XYZ」在編譯時會是「XYZ.dll」。不過,您也可以設置說明,公司,產品等。

您可以使用Product Field作爲項目名稱並將其設置爲您的產品的名稱。

要檢索此信息,您應該在項目中使用Type來獲取程序集。在Web應用程序的入口點不一定是你的網站的DLL它可能是一個Razor視圖引擎,或ASPX視圖引擎,等等等等

Type myType = typeof(ThingInMyProject); 
Assembly myAsm = myType.GetAssembly(); 
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(myAsm.Location); 
var title = fvi.Title; 
var companyName = fvi.CompanyName; 
var productName = fvi.ProductName; 

然後你可以使用「DLL的名稱」稱號或者你認爲合適的產品名稱。

+0

'typeof(ThingInMyProject)'是什麼?我不確定你想在這裏提到什麼課程。 – Bojan

+0

僞代碼...對你來說,它將是typeof(HomeController),或任何其他類型在你的DLL。 –

+0

問題是我不知道它將從HomeController或控制檯應用程序的某些功能。這是一個正在被所有東西調用的外部dll。 – Bojan