我正在Unity IoC中实现程序集的动态加载和注册。

给定这些类:

public interface IA { }
public interface IB { }
public interface IC { }

public class A : IA { }
public class B : IB
{
    public B(IA a) { }
}

public class C : IC
{
    public C(IB b) { }
}

而这个配置:
var assembly = Assembly.LoadFile(@"path\MyAsm.dll");
container.RegisterTypes(
    AllClasses.FromAssemblies(assembly),
    WithMappings.FromAllInterfacesInSameAssembly,
    WithName.Default,
    WithLifetime.Transient);

编码:
var c = container.Resolve(typeof(IC));

抛出:



以上所有代码均在同一程序集MyAsm中执行。在调试中分析容器时,Registrations属性列出了ABC到它们各自的接口(interface)以及它们自己的映射的正确集合。

有任何想法吗?

解决方案

在泰勒的回应之后,我改变了:
var assembly = Assembly.LoadFile(@"path\MyAsm.dll");


var assembly = Assembly.LoadFrom(@"path\MyAsm.dll");

解决了这个问题。 Assembly上的这两种方法具有相同的参数,相同的返回类型和vary just slightly in behavior纯邪恶的

最佳答案

我能够重现您遇到的错误。

因此,您要从文件Assembly.LoadFile(@"path\MyAsm.dll");加载程序集,然后要解析一个硬引用的container.Resolve(typeof(IC));类型。我相信这些类型来自两个不同的编译二进制文件。 @“path\MyAsm.dll”中二进制文件的类型已加载到容器中,但是您试图从应用程序路径的bin目录中解析二进制文件的类型(引用程序集CopyLocal设置为True)。

您需要从已经在应用程序域中加载的引用二进制文件中注册类型,或者需要使用反射来从加载的二进制文件中解析类型以查找类型。

var assembly = AppDomain.CurrentDomain.GetAssemblies().
               SingleOrDefault(asm => asm.GetName().Name == "MyAsm");
...
var c = container.Resolve(typeof(IC));

- 或者 -
var assembly = Assembly.LoadFile(@"path\MyAsm.dll");
...
var c = container.Resolve(assembly.GetType("MyAsm.IC"));

10-06 16:00