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