代码之家  ›  专栏  ›  技术社区  ›  Ashish Gupta Shiva

Unity应用程序块2.0-给定的程序集名称或代码基无效

  •  13
  • Ashish Gupta Shiva  · 技术社区  · 14 年前

    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)

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <configSections>
            <section name="unity"
                     type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
                       Microsoft.Practices.Unity.Configuration" />
        </configSections>
        <unity>
            <containers>
                <container>
                    <types>
                        <type type="Interfaces.IDoSomeWork1, Interfaces"
                              mapTo="Entities.ClassB, Entities" />
                        <type type="Interfaces.IDoSomeWork2, Interfaces"
                              mapTo="Entities.ClassC, Entities" />
                    </types>
                </container>
            </containers>
        </unity>
    </configuration>
    

    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>();
                classA.SomeMethodInClassA();
            }
        }
    

    当我运行客户机时,在section.Configure(container);,出现以下错误:-

    是无效的。(HRESULT的异常: 0x80131047)

    我不确定配置或类型是否有问题。有人能指出这里的错误吗?

    7 回复  |  直到 14 年前
        1
  •  20
  •   drew_w    10 年前

    如果其他人也有同样的问题-我也有这个错误,但有一个稍微不同的问题。我试图加载一个显然存在的程序集,如下所示:

    Assembly.Load("C:\\Program Files\\MyProgram\\MyAssembly.dll");
    

    经过多次反复试验,我发现你不应该走过这条路,当然也不应该包括 .dll

    Assembly.Load("MyAssembly");
    

    希望这迟早能帮助别人!

        2
  •  15
  •   Ashish Gupta Shiva    14 年前

    在回答我的问题之前,我必须声明上面发布的代码没有给我任何问题(构建错误等)。它只是给了我我在问题中所说的错误。现在Unity的问题是它没有提供无法加载的程序集或程序集中的类型。这是一个 requested feature

    在我的情况下,这是一个丢失的装配问题。我没有在客户端应用程序项目中引用实体程序集。似乎“实体”程序集只能在运行时解析(因为它没有给我任何编译时错误)。但是,运行时错误也没有任何用处。

    我看了一眼 Fusion Log viewer (它应该在.NET SDK文件夹中)。它是多麽实用的珍宝啊。它可以记录所有类型的程序集绑定(全部或仅失败),并给出了程序集无法加载的非常简洁的描述。很有帮助! FailedToLoadAssemblyDetected

    Log

        3
  •  6
  •   PaulB    13 年前

    如果你连接到域 AssemblyResolve 事件可以获取绑定失败的程序集。

     AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
    
        4
  •  3
  •   Mazrick    12 年前

    现在有更好的办法了!

    您可以在此处找到二进制文件和源代码: http://unity.codeplex.com/releases

        5
  •  0
  •   mdonatas    12 年前

    我发现最省时的方法 Type

    1. 转到位于codeplex的Unity页面的Sources部分 http://unity.codeplex.com/SourceControl/list/changesets
    2. 选择版本并下载源
    3. DEBUG 版本 Unity Unity.Configuration
    4. 从项目中删除对unity的引用,并从步骤3中添加对程序集的引用
    5. 在Visual Studio中转到 Debug > Exceptions 确保 Common Language Runtime Exceptions Thrown 列。

    现在去撞那东西。执行将在Unitys停止 TypeResolverImpl.SearchAssemblies typeNameOrAlias 参数将保留答案!

        6
  •  0
  •   FERV    8 年前

    像这样工作

    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")
    
        7
  •  0
  •   shamp00    8 年前

    请确保已在web.config文件所在的项目中添加缺少程序集的程序集引用。