簡體   English   中英

運行時在C#應用程序中加載程序集不存在於應用程序工作目錄中

[英]Loading Assemblies in c# application at runtime not present in application working directory

我正在開發需要一些第三方程序集(DLL)的ac#控制台應用程序。 在開發機器上,我知道這些程序集的位置,因此可以將它們添加為對VS2010項目的引用。 但我不確定客戶端(用戶)機器上的這些程序集路徑。 我可以從環境變量或注冊表值(可以由第三方工具或用戶添加)中獲得這些程序集的位置。 那么我的應用程序如何加載這些程序集?

如果程序集安裝在客戶端上,則會自動加載它們,因為它們應位於GAC中。 如果不是,則它們應與.exe放在同一文件夾中,或者可以通過Appdomain.AssemblyResolve事件以編程方式加載它們。 如果找不到程序集,則會觸發此事件:

    public MainWindow()
    {
        AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

        InitializeComponent();
    }

    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {            
        string assemblyName = args.Name.Remove(args.Name.IndexOf(',')) + ".dll";

        string s = @"C:\dlls\" + assemblyName;

        if (File.Exists(s))
        {
            return Assembly.LoadFile(s);
        }

        return null;
    }

//編輯:注意這一點,有時找不到很多程序集,這通常不是問題,因為它只是在其他地方搜索。 但是,如果您決定重寫此代碼並嘗試加載所有未找到的程序集,即刪除file.exists,則代碼將中斷。

如果將引用的程序集的“ Copy Local屬性設置為true ,則第三方程序集將復制到可執行文件附近的bin目錄中。

在此輸入圖像描述

這意味着當您將應用程序安裝在另一台計算機上時,這些dll將與可執行文件位於同一目錄中,因此加載這些程序集不會有任何問題。

好吧,如果我不明白您的問題是。

您具有C#應用程序,該應用程序通過AddReference靜態鏈接到Visual Studio解決方案中的某些DLL。 但是在客戶端計算機上,這些DLL不在相同的位置,而是通過一些已知的位置。

要解決這個問題,應該足夠使用了

AppDomainSetup.PrivateBinPath

在實際打電話之前

Application.Run(new MainForm());

這樣一來,你會告訴你的域查找自定義查找路徑為引用。

希望這可以幫助。

暫無
暫無

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

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