2010-10-17 4 views
12

giao diện (Trong assembly có tên là "giao diện" Trong dự án: -. Interfaces)Unity khối ứng dụng 2.0 - Tên lắp ráp nhất định hoặc codebase không hợp lệ

namespace Interfaces 
{ 
    public interface IDoSomeWork1 
    { 
     string DoSomeWork1(); 
    } 
} 

namespace Interfaces 
{ 
    public interface IDoSomeWork2 
    { 
     string DoSomeWork2(); 
    } 
} 

Dependencies (Trong assembly có tên là "Các đối tượng " Trong dự án: -. Entities)

namespace Entities 
{ 
    public class ClassB : IDoSomeWork1 
    { 
     public string DoSomeWork1() 
     { 
      return this.ToString(); 
     } 
    } 
} 

namespace Entities 
{ 
    public class ClassC : IDoSomeWork2 
    { 
     public string DoSomeWork2() 
     { 
      return this.ToString(); 
     } 
    } 
} 

class (Trong dự án: - 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 (Trong một dự án giao diện điều khiển ứng dụng: - 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> 

Client (Trong một dự án giao diện điều khiển ứng dụng: - 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>(); 
      classA.SomeMethodInClassA(); 
     } 
    } 

Và khi tôi chạy ứng dụng khách, tôi nhận được lỗi sau tại phần.Cấu hình (vùng chứa);: -

Tên lắp ráp đã cho hoặc mã số không hợp lệ. (Ngoại lệ từ HRESULT: 0x80131047)

Tôi không chắc chắn Nếu có bất kỳ điều gì sai với cấu hình hoặc loại. Bất cứ ai có thể xin vui lòng chỉ ra những sai lầm ở đây?

Trả lời

14

Trước khi trả lời câu hỏi của mình, tôi phải nói rằng mã được đăng ở trên không cho tôi bất kỳ vấn đề gì (xây dựng lỗi, v.v.). Nó chỉ cho tôi lỗi mà tôi đã nêu trong câu hỏi của mình. Vấn đề với Unity tại thời điểm này là nó không cung cấp assembly nào hoặc một kiểu nào trong assembly không thể nạp được. Đây là requested feature.

Trong trường hợp của tôi Đó là sự cố lắp ráp bị thiếu. Tôi đã không tham khảo lắp ráp thực thể vào dự án ứng dụng khách. Có vẻ như rằng "thực thể" lắp ráp có thể được giải quyết chỉ tại thời gian chạy (vì nó đã không cho tôi bất kỳ lỗi thời gian biên dịch). Tuy nhiên, lỗi thời gian chạy cũng không hữu ích chút nào.

Tôi đã xem Fusion Log viewer (Nó phải ở trong thư mục .NET SDK). Thật là một viên ngọc của một tiện ích. Nó có thể đăng nhập tất cả các loại ràng buộc lắp ráp (tất cả hoặc chỉ thất bại) và nó đưa ra một mô tả rất gọn gàng mà lắp ráp không thể tải. Rất hữu ích! FailedToLoadAssemblyDetected

Log

Vì vậy, thời gian tới, bạn có được điều này "Tên lắp ráp nhất định hoặc codebase không hợp lệ" lỗi, hãy thử Fusion Log Viewer. Nó sẽ không giúp bạn trong việc tìm kiếm những loại không thể được tải. Tuy nhiên, ít nhất bạn sẽ chắc chắn rằng tất cả các hội đồng của bạn đang nhận được nạp một cách chính xác.

+4

Đáng tiếc là tôi có vấn đề này cùng, nhận được thông báo lỗi tương tự, nhưng các bản ghi Fusion không hiển thị bất kỳ lỗi nào :( – CodingWithSpike

+3

Hãy chắc chắn rằng nó thể hiện một cái gì đó! Nó có thể là một chút buồn tẻ để thiết lập và quá trình mà bạn cần phải xem tải các assembly phải được khởi động lại sau khi các thiết lập trong FusionLog được áp dụng –

6

Nếu bạn kết nối miền AssemblyResolve sự kiện, bạn có thể nhận được lắp ráp không thể liên kết.

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
0

tôi thấy rằng phương pháp phát hiện mà Type chính xác thất bại trong việc ràng buộc tốn thời gian ít nhất là như sau:

  1. Tới Nguồn phần của trang Unity tại CodePlex http://unity.codeplex.com/SourceControl/list/changesets
  2. Chọn phiên bản và tải xuống các nguồn
  3. Xây dựng DEBUG phiên bản UnityUnity.Configuration (nếu dự án của bạn sử dụng nhiều hội đồng đoàn kết, hãy xây dựng chúng)
  4. Hủy bỏ tài liệu tham khảo để thống nhất từ ​​dự án của bạn và thêm tài liệu tham khảo để lắp ráp từ bước 3
  5. Trong Visual Studio đi đến Debug > Exceptions và chắc chắn rằng Common Language Runtime Exceptions có một hộp kiểm trong cột Thrown.

Bây giờ, hãy làm hỏng sự cố đó. Việc thực thi sẽ dừng lại trong phương thức TypeResolverImpl.SearchAssemblies của Unitys và thông số typeNameOrAlias sẽ giữ lại câu trả lời!

+0

Chúng ta có cần cài đặt assembly trong GAC để cấu hình nó trong app.config? – Arcadian

3

Hiện có một cách tốt hơn! Unity có phiên bản mới (hiện tại là 2.1.505.2), trong đó báo cáo rõ ràng chi tiết và cho phép bạn truy cập vào phần dưới cùng của nó ngay lập tức.

Bạn có thể tìm mã nhị phân và mã nguồn ở đây: http://unity.codeplex.com/releases

+0

Tôi đang ở trên Unity 2.1.5 và vẫn nhận được lỗi này mà không có chi tiết và không ghi nhật ký Fusion với thư viện C++/CLI 'Chế độ hỗn hợp' – MultiMat

0

Hãy chắc chắn rằng bạn đã thêm tài liệu tham khảo lắp ráp lắp ráp mất tích trong dự án mà tập tin web.config của bạn tồn tại.

Tôi đã bỏ lỡ điều này. Tôi đã thêm các tham chiếu assembly đó vào dự án đang sử dụng Unity để giải quyết lớp, nhưng bỏ lỡ thêm nó trong dự án cha mẹ nơi tập tin cấu hình được đặt. Điều này đã giải quyết được vấn đề của tôi.

18

Trong trường hợp bất kỳ ai khác có cùng vấn đề - tôi cũng gặp phải lỗi này nhưng có sự cố hơi khác. Tôi đã cố gắng để nạp một assembly đã tồn tại rõ ràng như sau:

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

Sau rất nhiều thử và sai tôi đã tìm ra rằng bạn đang không được phép vượt qua các con đường và bạn chắc chắn không phải bao gồm .dll sự mở rộng. Sau đây đã khắc phục sự cố của tôi:

Assembly.Load("MyAssembly"); 

Hy vọng rằng sẽ giúp người khác sớm hay muộn!

+8

O r sử dụng 'Assembly.LoadFrom' với đường dẫn. –

+0

@RomanReiner đã cứu tôi rất nhiều thời gian! –

+0

@RomanReiner Cảm ơn bạn –

0

công trình như thế này

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")