Unity应用程序块2.0 – 给定的程序集名称或代码库无效
接口(在名为“Interfaces”的程序集中。在项目中: – 接口)
namespace Interfaces { public interface IDoSomeWork1 { string DoSomeWork1(); } } namespace Interfaces { public interface IDoSomeWork2 { string DoSomeWork2(); } }
依赖关系(在名为“实体”的程序集中。在项目中: – 实体)
namespace Entities { public class ClassB : IDoSomeWork1 { public string DoSomeWork1() { return this.ToString(); } } } namespace Entities { public class ClassC : IDoSomeWork2 { public string DoSomeWork2() { return this.ToString(); } } }
类(在项目中: – UsingUnity)
public class ClassA { [Dependency] public IDoSomeWork1 DoSomeWork1 { get; set; } [Dependency] public IDoSomeWork2 DoSomeWork2 { get; set; } public void SomeMethodInClassA() { Console.WriteLine(DoSomeWork1.DoSomeWork1()); Console.WriteLine(DoSomeWork2.DoSomeWork2()); } }
App.Config(在控制台应用程序项目中: – ConsoleUsingUnity)
客户端(在控制台应用程序项目中: – ConsoleUsingUnity)
public class Class1 { static void Main(string[] args) { IUnityContainer container = new UnityContainer(); // Load from config file UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); section.Configure(container); ClassA classA = container.Resolve(); classA.SomeMethodInClassA(); } }
当我运行客户端时,我在section.Configure(container);得到以下错误: –
给定的程序集名称或代码库无效。 (HRESULTexception:0x80131047)
我不确定配置或类型是否有任何问题。 有人可以指出这里的错误吗?
如果其他人遇到同样的问题 – 我也遇到了这个错误,但问题略有不同。 我试图加载一个明显存在的组件,如下所示:
Assembly.Load("C:\\Program Files\\MyProgram\\MyAssembly.dll");
经过大量的试验和错误,我发现你不应该通过这条路径,你当然不应该包含.dll
扩展名。 以下修复了我的问题:
Assembly.Load("MyAssembly");
希望迟早能帮助别人!
在回答我的问题之前,我必须说明上面发布的代码没有给我任何问题(构建错误等)。 它只是给了我在我的问题中说的错误。 Unity在这个时间点的问题是它没有提供哪个程序集或程序集中的哪些类型无法加载。 这是一项要求的function 。
在我的情况下,这是一个缺少assembly问题。 我没有将实体程序集引用到客户端应用程序项目中。 似乎“实体”程序集只能在运行时解析(因为它没有给我任何编译时错误)。 但是,运行时错误根本没用。
我看了一下Fusion Log查看器 (它应该在.NET SDK文件夹中)。 它是一个实用工具的gem。 它可以记录所有类型的程序集绑定(全部或仅故障),并给出了无法加载哪个程序集的非常简洁的描述。 很有帮助!
因此,下次您收到“给定的程序集名称或代码库无效”错误,请尝试使用Fusion Log Viewer。 它不会帮助您找到无法加载的类型。 但是,至少您将确保所有程序集都正确加载。
如果连接域AssemblyResolve事件,则可以获取无法绑定的程序集。
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
现在有更好的方法! Unity有一个新版本(目前为2.1.505.2),它清楚地报告了详细信息并让您立即了解它的底部。
你可以在这里找到二进制文件和来源: http : //unity.codeplex.com/releases
我发现找到完全无法绑定的Type
的最耗时的方法如下:
- 转到codeplex http://unity.codeplex.com/SourceControl/list/changesets上的Unity页面的Sources部分
- 选择版本并下载源
- 构建
Unity
和Unity.Configuration
DEBUG
版本(如果您的项目使用更多的统一程序集,也可以构建它们) - 从项目中删除对unity的引用,并在步骤3中添加对程序集的引用
- 在Visual Studio中,转到“
Debug > Exceptions
,并确保“Common Language Runtime Exceptions
在“已Thrown
列中有一个复选框。
现在去崩溃了。 执行将在Unitys的TypeResolverImpl.SearchAssemblies
方法中停止, typeNameOrAlias
参数将保留答案!
像这样工作
Dim dllData = System.IO.File.ReadAllBytes(dllFullPath) Dim asb As System.Reflection.Assembly asb = System.Reflection.Assembly.Load(dllData) Dim cls As Object = asb.CreateInstance("namespace.class")
请确保您在web.config文件所在的项目中添加了缺少的程序集的程序集引用。
我错过了这个。 我已经在使用Unity来解析类的项目中添加了那些程序集引用,但是错过了将它添加到配置文件所在的父项目中。 这解决了我的问题。