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



==编译命令==

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

===exec命令===

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设置(或指定文件的URL位置(使用codebase设置(。您可以设置环境来更改搜索路径等。

或者,您可以添加一些运行时代码,允许您覆盖默认行为,并调用Assembly.LoadFrom来提供文件的完整路径。您可以将其作为初始化的一部分,也可以在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事件来做一些有趣的事情,比如从压缩资源加载程序集。

相关内容

  • 没有找到相关文章

最新更新