有没有办法在 C# 的父路径中添加引用(dll)?

Is there an way to add reference(dll) in parent path in C#?

==编译命令==

csc -r:"../Newtonsoft.Json.dll" test.cs

== 执行命令 ==

mono test.exe

== 执行结果:依赖错误==

 System.IO.FileNotFoundException: Could not load file or assembly 'Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, 
 PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies.

"Newtonsoft.Json.dll" 此文件位于父路径中。所以我加了一个dll的引用,编译成功了,但是当我执行exe文件的时候,却获取不到我加的dll引用。

当我将 cs 文件和 dll 文件放在同一个目录中时,效果很好,但这不是我想要的。

是否有使用命令行界面从父路径中的 dll 文件添加引用的解决方案?

我使用 csc 进行编译,使用 mono 进行执行。

谢谢。

引用是无路径的。这意味着无论程序集位于何处,您的程序都知道它具有对 Newtonsoft.Json, Version=x.x.x.x, Culture=... 的引用,依此类推。您可以使用应用程序配置(application.configmyprogram.exe.config)做一些事情,将内容组织到子文件夹中(使用 probing setting) or specify a URL location for the file (using the codebase 设置)。可以设置环境更改搜索路径等。

或者您可以添加一些运行时代码,允许您覆盖默认行为和调用 Assembly.LoadFrom to provide a full path to the file. You can either do it as part of your initialization or in a handler for the AppDomain.AssemblyResolve 事件 - 这通常是更好的方法,因为它只会在实际需要程序集时调用。

例如:

using System.IO;
using System.Reflection;

static class ParentPathResolver
{
    public static void Init()
    {
        AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(Resolve);
    }

    private static Assembly? Resolve(object? sender, ResolveEventArgs args)
    {
        var filename = new AssemblyName(args.Name).Name + ".dll";
        var fullname = Path.GetFullPath(Path.Combine("..", filename));
        if (File.Exists(fullname))
            return Assembly.LoadFrom(fullname);
        return null;
    }
}

当然,您可以将自己的代码添加到 Resolve 方法中以在几乎任何地方进行搜索,只要您不陷入解析循环即可。我使用 AssemblyResolve 事件来做一些有趣的事情,比如从压缩资源中加载程序集。