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>
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
@ 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 –
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. –