2009-11-26 37 views
1

我有兩個調用類庫的項目。我可以在我的班級圖書館檢查哪個項目正在調用圖書館嗎?c#:檢查哪個項目正在調用類庫

+2

我可以問 - 你想解決什麼設計問題?反思永遠不會是正確的答案...... – Kobi 2009-11-26 09:17:45

+5

@Kobi:雖然我同意你的觀點,即Reflection可能不是解決這個問題的答案,但總的來說,有很多問題只能通過Reflection或者Reflection才能解決。我在這裏至少有兩個依賴Reflection的應用程序,因爲沒有其他方法。所以我不同意Reflection *從不*是正確的答案。 – OregonGhost 2009-11-26 09:25:42

+1

@Kobi,反思可以被濫用,但它是一堆問題的「正確」答案。如果有什麼我看到它越來越普遍地出現。看看http://stackoverflow.com/questions/49737/use-cases-for-reflection關於它在哪裏非常有用的一些想法。 – ScottS 2009-11-26 09:38:58

回答

3

嗯...這聽起來不太好。你試圖實現的是從你的類庫創建一個依賴項 - >項目,而不是項目 - >類庫依賴項。

從我的觀點來看,這是「不可」實現的,如果是這樣的話,那麼很難實現。一個好的類庫應該具有通用性,並且不應該根據調用者來改變行爲。

(也許你可以詳細描述你的問題的性質,所以我可以幫助你更好地找到一個更好的解決方案)

+0

雖然好的類庫應該具有通用性,但如果類庫是應用程序的一部分並且不打算在別處使用,那肯定不是這樣。另一方面,即使這樣的圖書館應該改變行爲只有*當給予不同的參數*。 – OregonGhost 2009-11-26 09:29:52

+0

我同意。在談論類圖書館時,我總是想到一個通用的,可重用的構造。鑑於他說圖書館被2個項目訪問,我認爲它是通用的。一個類庫可能依賴於某種配置,但決不會因爲自己做出決定而有所不同。配置的設置應始終來自外部。 – Juri 2009-11-26 10:43:27

2

如果項目有不同的命名空間,你可以使用StackTrace建立自己的調用堆棧:

public static void Main() 
{ 
    StackTrace stackTrace = new StackTrace(); 
    StackFrame[] stackFrames = stackTrace.GetFrames(); 
    foreach (StackFrame stackFrame in stackFrames) 
    { 
     Console.WriteLine(stackFrame.GetMethod().Name); 
    } 
} 
2

爲什麼不存儲在app.config文件中每個項目的唯一值,然後從類庫中看到它的值。根據你正在運行的項目(應用程序),它應該選擇正確的應用程序配置。或者即使只是檢查System.Reflection.Assembly.GetCallingAssembly().GetName().Name()

+0

執行程序集不是包含調用GetExecutingAssembly()的代碼的程序集嗎?即如果你在庫裝配中調用它,你會得到你的庫裝配 - 但仍然存在GetCallingAssembly,這可能是你的意思:) – OregonGhost 2009-11-26 09:32:13

+0

+1對於GetExecutingAssembly – ScottS 2009-11-26 09:42:48

+0

@OregonGhost我不好! – James 2009-11-26 09:48:09

1

,如果你正在尋找的是主應用程序組件,那麼正確的呼叫Assembly.GetEntryAssembly()。全​​名 只是我的2¢

1

Assembly.GetCallingAssembly()會給你的程序集的引用它調用了你放置那行代碼的方法。我認爲這正是你所要求的,但圖書館應該關心其調用者的情況非常罕見,所以你可能想要考慮這種方法是否確實是正確的。

// in Assembly 1 
public class Assembly1Class 
{ 
    public void SomeMethod() 
    { 
     assembly2ClassInstance.SomeAPIMethod(); 
    } 
} 

// in Assembly 2 (the library) 
public class Assembly2Class 
{ 
    public void SomeAPIMethod() 
    { 
     Debug.WriteLine(Assembly.GetCallingAssembly().FullName; 
    } 
} 
相關問題