簡體   English   中英

運行時的.Net Load Reference

[英].Net Load Reference at runtime

我有以下要求,

  • 我有C#/ .net控制台應用程序,它指的是'System.Data.Sqlite.dll'
  • 'System.Data.Sqlite.dll'未在GAC中注冊(我不想)
  • 我不想將它保留在保存可執行文件(.exe)的目錄中。

  • 如何將'System.Data.Sqlite.dll'文件保存在其他目錄中 ,並在運行時安全地加載它,然后才能在應用程序代碼中引用它?

您可以使用手動裝配分辨率來執行此操作。

您需要為當前AppDomain中的AssemblyResolve事件提供委托

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += assemblyResolver.ResolveEventHandler;

當應用程序有任何無法解析的程序集引用時,它將調用此委托來解決程序集。 然后,您只需返回委托中請求的程序集:

Assembly assembly = Assembly.LoadFrom (assemblyPath);
return assembly;

希望這可以幫助

我不確定你為什么要再次這樣做,這是對最佳做法的偏離,但要回答你的問題:你可以使用

Assembly.LoadFrom Method (String path)

System.Reflection命名空間

&在app.config文件中有路徑

在MSDN上的Assembly.LoadFrom

您可以將探測元素添加到應用程序的配置文件中。 這允許檢查除默認值之外的其他文件夾以查找所需的庫。 看到這里

出於安全原因,它仍然必須低於exe文件夾。

你可以使用Assembly.LoadFrom(filename)

但是,正如評論者指出的那樣,我不明白你為什么要那樣做?

您需要使用Assembly.LoadFromType.GetType以及Type.GetMethod的組合,使用反射(使用System.Reflection命名空間)加載您的dll和方法。

下面是一個關於如何使用反射從運行時加載的dll動態調用方法的示例。

static string DynamicMethodCall(string dllPath, string someClass, string someMethodName, object[] parameters)
        {
            Assembly dll = Assembly.LoadFile(dllPath);

            Type type = dll.GetType(someClass);

            if (type == null)
            {
                Exception ex = new Exception("class not found");
                throw ex;
            }

            MethodInfo method = type.GetMethod(someMethodName);

            if (method == null)
            {
                Exception ex = new Exception("method not found");
                throw ex;
            }

            if (parameters.Length >= 1)
            {
                object[] myparam = new object[1];
                myparam[0] = parameters;
                return (string)method.Invoke(null, myparam);
            }
            else
            {
                return (string)method.Invoke(null, null);
            }
        }

您可以將DLL作為嵌入式資源包含在EXE項目中,當您的應用程序啟動時,您可以將DLL保存到EXE文件目錄中(並在應用程序結束時將其刪除,但我不知道問題是什么將DLL放在EXE目錄中)。 只要在加載引用SqlLite的任何內容之前執行提取,這將起作用。

更新:因為您想要執行插件式DLL,您可以將DLL保存在單獨的目錄中,並在應用程序啟動時將它們復制到EXE文件夾中。

我無法看到引用程序集與exe文件分開的原因,但一種方法是將它們放在exe文件所在目錄的單獨目錄中,並在應用程序中包含一個探測元素。配置文件。

您可以使用反射: http//msdn.microsoft.com/en-us/library/system.reflection.assembly.load%28VS.71%29.aspx

因性能而要小心。 必須謹慎使用反思。

暫無
暫無

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

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