在运行时加载c#应用程序中的程序集不在应用程序工作目录中

时间:2012-02-13 12:30:55

标签: c#

我正在开发一个需要一些第三方程序集(DLL)的c#控制台应用程序。在开发机器上,我知道这些程序集的位置,所以我可以添加它们作为VS2010项目的参考。但我不确定客户端(用户)机器上的这些程序集路径。 我可以从环境变量或注册表值(可以由第三方工具或用户添加)获取这些程序集位置。 那么我的应用程序如何加载这些程序集呢?

3 个答案:

答案 0 :(得分:2)

如果程序集安装在客户端上,则会自动加载它们,因为它们应位于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,你的代码就会中断。

答案 1 :(得分:1)

如果将引用的程序集的Copy Local属性设置为true,则第三方程序集将被复制到可执行文件附近的bin目录中。

enter image description here

这意味着当您将应用程序安装在另一台计算机上时,您将把这些dll与可执行文件放在同一目录中,因此加载这些程序集不会有任何问题。

答案 2 :(得分:0)

好吧,如果我对你的问题进行检查,你的问题就是。

您有C#个应用程序通过AddReference静态链接到Visual Studio解决方案中的某些DLL。但是在客户端机器上,这些DLL不在同一个位置,但是,顺便说一下kn一些已知的位置。

要解决此问题,应该足以使用

AppDomainSetup.PrivateBinPath

在实际调用之前

Application.Run(new MainForm());

通过这种方式,您将告诉您的域在自定义查找路径中查找以供参考。

希望这有帮助。