2011-10-01 12 views
9

Tôi đang làm theo hướng dẫn từ sổ làm việc khóa học Microsoft .Net năm 2006, trải qua một trong các bài tập. (Cụ thể là khóa học này là MS2349B và tôi đang thực hiện Bài tập mô-đun 4). Những bài tập này dường như được xây dựng cho những ngày trước Vista khi mọi người đều có quyền quản trị đầy đủ mọi lúc. Bài tập này liên quan đến việc xây dựng một hội đồng tên mạnh, cài đặt nó trong GAC, xây dựng một tập tin thực thi cục bộ đối với tập hợp được đặt tên mạnh mẽ, xác minh rằng thực thi có thể chạy được.Khi thăm dò hội đồng tại sao tìm kiếm publicKeyToken khác khi chạy với tư cách quản trị viên so với người dùng bình thường?

Theo hướng dẫn này, tôi đăng ký lắp ráp của tôi sử dụng một khối #if:

#if STRONG 
[assembly: System.Reflection.AssemblyVersion("2.0.0.0")] 
[assembly: System.Reflection.AssemblyKeyFile("OrgVerKey.snk")] 
#endif 

tôi xây dựng thực thi của tôi như là một người dùng cục bộ:

C:\path\to\lab>csc /define:STRONG /target:library 
/out:AReverser_v2.0.0.0\AReverser.dll AReverser_v2.0.0.0\AReverser.cs 
C:\path\to\lab>csc /reference:MyStringer\Stringer.dll  
/reference:AReverser_v2.0.0.0\AReverser.dll Client.cs 

tôi cài đặt nó vào GAC thông qua một hình ảnh lời nhắc lệnh studio chạy với tư cách quản trị viên:

C:\path\to\lab>gacutil /i AReverser_v2.0.0.0\AReverser.dll 

Khi tôi chạy lệnh exe trong lời nhắc của quản trị viên tôi có được sản lượng tôi mong đợi - ứng dụng chạy tốt và xuất hiện để tải dll một cách chính xác từ gấc. Khi tôi chạy theo dấu nhắc lệnh không phải quản trị tôi nhận được lỗi sau

Unhandled Exception: System.IO.FileLoadException: Could not load file or assembl 
y 'AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b5fcbdcff229fabb' 
or one of its dependencies. The located assembly's manifest definition does not 
match the assembly reference. (Exception from HRESULT: 0x80131040) 
    at MainApp.Main() 

Có gì lạ với tôi là PublicKeyToken là không giống như những gì trong GAC:

AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0027634b66 

NHƯNG nếu tôi gỡ bỏ cài đặt AReverser từ GAC và cố gắng để chạy exe của tôi như nhắc nhở admin tôi nhận được lỗi sau mà chỉ tìm kiếm của mình cho công chúng f0548c0027634b66 thẻ chìa khóa dự kiến:

C:\path\to\lab>gacutil /u "AReverser,Version=2.0.0.0,Culture=neutral, 
PublicKeyToken=f0548c0027634b66" 
Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.1 
Copyright (c) Microsoft Corporation. All rights reserved. 


Assembly: AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0027 
634b66 
Uninstalled: AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0 
027634b66 
Number of assemblies uninstalled = 1 
Number of failures = 0 

C:\path\to\lab>Client.exe 

Unhandled Exception: System.IO.FileLoadException: Could not load file or assembl 
y 'AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0027634b66' 
or one of its dependencies. The located assembly's manifest definition does not 
match the assembly reference. (Exception from HRESULT: 0x80131040) 
    at MainApp.Main() 

Thông báo dưới Admin, thực sự tìm kiếm publicKeyToken đúng.

Điều gì mang lại? Tại sao tìm kiếm publickKeyTokens lại khác nhau? Tôi có thể làm gì sai?

EDIT

Ứng dụng cấu hình chúng ta đang nói đến sử dụng có thể là thủ phạm, tôi tự hỏi nếu bạn phải quản trị để áp dụng một số các thiết lập này. Loại bỏ nó dường như gây ra chạy như admin để thất bại (mặc dù trong trường hợp đó publicKeyToken được liệt kê là NULL). Đây là cấu hình ứng dụng của tôi

<configuration> 
    <runtime> 
     <assemblyBinding 
      xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <probing privatePath="MyStringer"/> 
      <publisherPolicy apply="no"/> 
      <dependentAssembly> 
       <assemblyIdentity name="AReverser" 
        publicKeyToken="f0548c0027634b66" 
        culture=""/> 
       <publisherPolicy apply="no"/> 
       <bindingRedirect oldVersion="2.0.0.0" 
        newVersion="2.0.0.0"/> 
      </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 
+0

Bạn đã đăng ký hội đồng chưa? Tôi không thấy tệp khóa trong câu lệnh CSC của bạn. – user957902

+0

@ user957902 Tôi ký chúng với khối '#if STRONG' ở trên vì các ví dụ trong sổ làm việc MS2349B cho tôi biết –

+1

Tệp .snk ở đâu? Nếu bạn đã tạo của riêng mình thì bạn sẽ phải thay đổi giá trị mã thông báo trong tệp cấu hình. –

Trả lời

1

Tìm kiếm đĩa của bạn cho AReverser.dll. Có thể bạn có một số bản sao bổ sung ở đâu đó bị ẩn. VS có thể tạo các bản sao bóng của các dll đã biên dịch.

Nếu điều đó không giúp kích hoạt ghi nhật ký kết hợp (sử dụng bản ghi fuslogvw.exe hoặc spool fusion vào đĩa) và sau đó tìm trong nhật ký nơi tệp dll có vấn đề được tải. IMO đó là dll sai được tải.

0

Giải pháp của bạn nói lắp ráp ở đâu? Visual studio không sử dụng gac để xây dựng nên nếu bạn có phiên bản khác của assembly lắp ráp bị bỏ lại trong thư mục tham chiếu của bạn, client sẽ được xây dựng dựa vào đó và thất bại khi cố tải vào thời gian chạy vì gac được tải trước .