==编译命令==
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.config
或myprogram.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
事件来做一些有趣的事情,比如从压缩资源加载程序集。