错误是因为您没有在第二个项目中复制 dll,您添加了对 dll 的引用,因此它被复制了,但不是您的 dll 引用的 dll,因此缺少库。
或者您使用您的 dll 重新分发依赖项,或者您可以将 dll 作为资源嵌入到您的 dll 中,然后拦截程序集负载并通过资源提供它:http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx
编辑:为了在 dll 中执行此操作,您需要使用静态类并在使用任何依赖于其他库的类之前调用静态初始化程序。
这是一个示例设置:
-一个名为 LibraryB 的库,它提供了一个像这样的简单类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LibraryB
{
public class ReferencedClass
{
public int GetIt()
{
return 5;
}
}
}
-一个名为 LibraryA 的库,它引用 LibraryB 并提供两个类,初始化器和真实类:
初始化器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace LibraryA
{
public static class Initializer
{
public static void Init()
{
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
if (!args.Name.StartsWith("LibraryB"))
return null;
return Assembly.Load(LibraryA.Properties.Resources.LibraryB);
};
}
}
}
类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LibraryA
{
public class RealClass
{
public int DoIt()
{
LibraryB.ReferencedClass cl = new LibraryB.ReferencedClass();
return cl.GetIt();
}
}
}
LibraryA 还具有作为资源嵌入的 LibraryB.dll 编译库。
-一个名为 Test 的项目,它只引用 LibraryA:
using LibraryA;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Initializer.Init();
RealClass c = new RealClass();
Console.WriteLine("From LibraryA: " + c.DoIt());
Console.ReadKey();
}
}
}
如果您设置了所有内容并执行它,它将起作用,请记住,如果您是通过 Visual Studio 进行的,vs 将复制 dll,以便在编译所有复制 exe 和 LibraryA 并执行后进行真正的测试,它可以在没有 LibraryB 的情况下工作,并且 LibraryB 正在从 LibraryA 使用。