如何在我的Web应用程序的bin目录之外加载程序集

时间:2010-03-27 13:39:38

标签: c# asp.net

我想从bin文件夹以外的位置加载我的程序集。

我该如何做到这一点?

谢谢

3 个答案:

答案 0 :(得分:6)

请注意:

我之前的回答是不正确的。 Sam Holder的假设听起来似乎有道理,所以我写了一些测试来确认。

考虑确认。

要进行测试,请添加对项目或dll的引用,并将“Copy Local”设置为false。确保你'显示所有文件'并删除bin目录,否则你将会有一个挥之不去的dll。

<强> Global.asax中

namespace WebApplication1
{
    public class Global : System.Web.HttpApplication
    {

        protected void Application_Start(object sender, EventArgs e)
        {
            AppDomain currentDomain = AppDomain.CurrentDomain;
            currentDomain.AssemblyResolve += new ResolveEventHandler(currentDomain_AssemblyResolve);
        }

        System.Reflection.Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            if (args.Name == "ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
            {
                String assemblyPath = @"C:\Projects\StackOverflowAnswers\WebApplication1\ClassLibrary1\bin\Debug\ClassLibrary1.dll";
                Assembly assembly = Assembly.LoadFrom(assemblyPath);
                return assembly;
            }
            return null;

        }
.....
OP应该给我一个upvote,但Sam应该得到支票。

答案 1 :(得分:4)

我不确定您是否可以在asp.net中执行此操作,但在.net应用程序中,您可以为当前AppDomain中的AssemblyResolve事件提供委托

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

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

String assemblyPath = //some logic to determine the location of the assembly
Assembly assembly = Assembly.LoadFrom (assemblyPath);
return assembly;

答案 2 :(得分:0)

将要使用的文件夹添加到PATH环境变量中。这将允许您从命令行键入my-program.exe,它将运行。

如果您尝试在内部加载某些内容作为程序的一部分,则可以更改工作目录SetCurrentDirectory或仅使用每个文件访问的完整路径。