我有以下要求,
我不想将它保存在保存可执行文件(.exe)的目录中。
如何将'System.Data.Sqlite.dll'文件保存在其他目录,并在运行时安全地加载它,然后才能在应用程序代码中引用它?
答案 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文件中有路径
答案 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
因性能而要小心。必须谨慎使用反思。