簡體   English   中英

C#隱藏參考

[英]C# Hidden References

我試圖確定我的程序集需要編譯哪些dll。 我在一個解決方案中有兩個示例項目Scratch和ScratchTest。 這是Scratch的Program.cs:

using System.ServiceProcess;

namespace Scratch
{
    public class A : ServiceBase
    {
        static void Main(string[] args)
        {
        }
    }
}

Scratch引用了System.ServiceProcess.dll。

這是ScratchTest的program.cs:

namespace ScratchTest
{
    class Program
    {
        static void Main(string[] args)
        {
        Scratch.A o;
        }
    }
}

ScratchTest必須同時引用Scratch和System.ServiceProcess.dll。 但是,生成的ScratchTest.dll沒有引用System.ServiceProcess.dll,只有Scratch。 我都知道這兩個

Assembly.GetReferencedAssemblies()

並使用.net反射器。 所以我的問題是,我怎么能說ScratchTest需要System.ServiceProcess.dll進行編譯? 特別是考慮到SratchTest不一定要引用所有Scratch的引用,因為可能會有一些沖突。 謝謝,埃里克

第一件事是您面臨的問題並非特定於ServiceBase類。 它與CLR如何准確地檢測C#程序的類型相關性並加載引用的程序集有關。 C#編譯器只是在編譯時預先給您一個錯誤,因為當CLR嘗試運行您的程序時,該錯誤也會在運行時失敗。 這是我在解釋您的問題的解決方案時所假定的:

盡管您已經在解決方案中定義了兩個入口點,但ScratchTest是您的啟動項目,因為Main方法同時存在於“ Scratch”和“ ScratchTest”項目中。 為了避免混淆,盡管您的解決方案不會對您當前的問題產生任何影響,但通常只應為您的解決方案提供一種主要方法(入口點)。

解決方案 :當您在scratchTest項目中引用類A時,您不僅在引用類A,而且還引用了ServiceBase類,因為類“ A”是繼承自它。 因此,當編譯器嘗試編譯您的ScratchTest項目時,它將嘗試在當前引用的程序集中找到依賴類型,即“ A”和ServiceBase 這里的重點是,CLR始終嘗試僅在其引用直接存在於您要加載的程序集本身的清單元數據中的程序集中查找依賴項類型(在本例中為ScratchTest)。 從不以構造解決方案的方式遞歸搜索依賴類型。 本質上期望CLR在所有引用的程序集中搜索依賴項類型,然后依次引用它們的引用程序集,這將對.Net應用程序啟動產生很大的性能影響。

同時,您創建的大多數C#項目中通常都引用MsCorLibSystemSystem.CoreSystem.Data類的核心.Net庫。 然后考慮其他情況,如果CLR實施了通過引用程序集遞歸查找依賴項類型的邏輯,那么它將在每次搜索依賴項類型時檢查是否已經通過特定程序集進行檢查,從而付出了額外的努力。這會進一步損害啟動性能。

要修復您的代碼,您可以執行以下兩項操作:

  • 根據C#編譯器的建議,將對System.ServiceProcess.dll引用添加到ScratchTest項目。

要么

  • 在“ ScratchTest”項目本身中使用類A,因為它已經包含對System.ServiceProcess.dll的引用

我認為您不需要在測試文件上顯式調用System.ServiceProcess。

測試文件沒有使用對System.ServiceProcess中任何方法或類的任何引用,僅使用了Scratch。

您無需要求引用的分類庫使用的所有庫,只需類當前正在使用的庫即可。

因此,ScratchTest僅使用Scrath,而Scratch使用System.ServiceProcess。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM