运行时的.Net Load Reference

时间:2009-07-10 12:18:28

标签: .net reflection assemblies

我有以下要求,

  • 我有C#/ .net控制台应用程序,它指的是'System.Data.Sqlite.dll'
  • 'System.Data.Sqlite.dll'未在GAC中注册(我不想)
  • 我不想将它保存在保存可执行文件(.exe)的目录中。

  • 如何将'System.Data.Sqlite.dll'文件保存在其他目录,并在运行时安全地加载它,然后才能在应用程序代码中引用它?

8 个答案:

答案 0 :(得分:9)

您可以使用手动装配解决方案来执行此操作。

您需要为当前AppDomain

中的AssemblyResolve事件提供委托
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += assemblyResolver.ResolveEventHandler;

当应用程序有任何无法解析的程序集引用时,它将调用此委托来解决程序集。 然后,您可以简单地从委托中返回请求的程序集:

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

希望这会有所帮助

答案 1 :(得分:4)

我不确定你为什么要再次这样做,这是对最佳做法的偏离,但回答你的问题: 你可以用

Assembly.LoadFrom Method (String path)

来自System.Reflection命名空间

&安培;在app.config文件中有路径

Assembly.LoadFrom on MSDN

答案 2 :(得分:4)

您可以将探测元素添加到应用程序的配置文件中。这允许检查除默认值之外的其他文件夹以查找所需的库。请参阅here

出于安全原因,它仍然必须低于exe文件夹。

答案 3 :(得分:1)

您可以使用 Assembly.LoadFrom(文件名)

但是正如评论者指出的那样,我不明白你为什么要那样做?

答案 4 :(得分:1)

您需要使用 Assembly.LoadFrom Type.GetType <的组合,使用反射(使用 System.Reflection 命名空间)加载您的dll和方法/ strong>和 Type.GetMethod

这是一个关于如何使用反射从运行时加载的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);
            }
        }

答案 5 :(得分:0)

您可以将DLL作为嵌入式资源包含在EXE项目中,当您的应用程序启动时,您可以将DLL保存到EXE文件目录中(并在应用程序结束时将其删除,但我不知道是什么问题是在EXE目录中有DLL)。只要在加载引用SqlLite的任何内容之前执行提取,这将起作用。

更新:既然你想做插件式的DLL,你可以将DLL保存在一个单独的目录中,并在应用程序启动时将它们复制到EXE文件夹中。

答案 6 :(得分:0)

我无法看到引用程序集与exe文件分开的原因,但是一种方法是将它们放在下的下的目录中,其中exe文件是找到并在app.config文件中包含一个探测元素。

答案 7 :(得分:0)

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

因性能而要小心。必须谨慎使用反思。