Trước hết tôi cần nhấn mạnh rằng đây là câu hỏi hơi khác so với câu hỏi this thread . Ngoài ra, việc cài đặt KB2468871 không giúp ích gì."Không thể tải tệp hoặc lắp ráp 'System.Core, Version = 2.0.5.0, ..." ngoại lệ khi tải Thư viện lớp di động
Tôi đã cố gắng đơn giản hóa vấn đề này càng nhiều càng tốt. Nói chung nó về tải hội đồng PCL trong ứng dụng Desktop với Assembly.LoadFile (...).
Giả sử có một ứng dụng giao diện điều khiển .NET 4.0 (được gọi là "C"). Nó tham chiếu đến phiên bản .NET 4.0 (được gọi là "N4") và PCL assembly (được gọi là "PCL").
nơi N4 trông như thế này:
using System.Linq;
namespace N4
{
public class ClassInN4
{
public static string Greet()
{
return new string(
"hello from N4"
.ToCharArray()
.Select(char.ToUpper)
.ToArray()
);
}
}
}
PCL trông như thế này:
using System.Linq;
namespace PCL
{
public class ClassInPCL
{
public static string Greet()
{
return new string(
"hello from pcl"
.ToCharArray()
.Select(char.ToUpper)
.ToArray()
);
}
}
}
và C giống như thế này:
using System;
using System.IO;
using System.Reflection;
using N4;
using PCL;
namespace C
{
internal class Program
{
private static void Main(string[] args)
{
Test();
Console.ReadLine();
}
private static void Test()
{
Test("N4", ClassInN4.Greet);
Test("PCL", ClassInPCL.Greet);
}
private static void Test(
string title,
Func<string> generator)
{
try
{
Console.WriteLine(
"{0}: {1}", title, generator());
}
catch (Exception e)
{
Console.WriteLine(
"{0}: {1} -> {2}", title, e.GetType(), e.Message);
}
}
}
}
Khi bạn chạy ứng dụng này bạn sẽ có được hoàn toàn kết quả chính xác:
N4: HELLO FROM N4
PCL: HELLO FROM PCL
Hãy thêm sự kiện AssemblyResolve để CurrentDomain trong Program.Main:
AppDomain.CurrentDomain.AssemblyResolve += (_, a) => {
var fileName = Path.GetFullPath(
new AssemblyName(a.Name).Name + ".data");
Console.WriteLine("Probing '{0}'", fileName);
return
File.Exists(fileName)
? Assembly.LoadFile(fileName)
: null;
};
Vì vậy, những gì nó làm nếu lắp ráp không thể tìm thấy nó cố gắng để tải nó từ ".data" tập tin.
Hãy chuyển thư mục ứng dụng và đổi tên "N4.dll" thành "N4.data" và chạy "C.exe".
Probing 'C:\xxx\C\bin\Debug\N4.data'
N4: HELLO FROM N4
PCL: HELLO FROM PCL
Vì vậy, nó đi qua AssemblyResolve và cuối cùng tải "N4.data" và hoạt động tốt như bản gốc.
Hãy trở lại "N4.data" thành "N4.dll" và đổi tên "PCL.dll" thành "PCL.data" và ...
Probing 'C:\xxx\C\bin\Debug\PCL.data'
N4: HELLO FROM N4
Probing 'C:\xxx\C\bin\Debug\System.Core.data'
Probing 'C:\xxx\C\bin\Debug\System.Core.data'
Probing 'C:\xxx\C\bin\Debug\System.Core.data'
PCL: System.IO.FileNotFoundException -> Could not load file or assembly 'System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes' or one of its dependencies. The system cannot find the file specified.
Xin lưu ý rằng lắp ráp PCL đã được nạp tốt , vấn đề là, nó chỉ không thể tìm thấy phụ thuộc của nó (System.Core) nữa.
Giống như Assembly.LoadFile (tên tệp) là-no-no nếu lắp ráp được nạp là di động.
Có ai có vấn đề này không? Có ai đã giải quyết vấn đề này không?
Bạn có thể tìm thấy tất cả các tệp here.
EDIT: Nhờ leppie vì đã buộc tôi kiểm tra các tùy chọn khác. Tôi thực sự muốn chắc chắn rằng tôi không nói dối trong khi tôi trả lời "Yeah, yeah, tôi đã cố gắng". Rõ ràng nó là giá trị kiểm tra.
Từ Suzanne Cook's .NET CLR Notes:
Hãy cẩn thận - đây không phải là điều tương tự.
LoadFrom() đi qua Fusion và có thể được chuyển hướng đến một hội đồng khác ở một đường dẫn khác nhưng với cùng một danh tính đó nếu một đã được tải trong ngữ cảnh LoadFrom. LoadFile() không liên kết thông qua Fusion ở tất cả - bộ nạp chỉ tiếp tục và tải chính xác * những gì người gọi đã yêu cầu. Nó không sử dụng ngữ cảnh Load hoặc LoadFrom.
Bạn đã thử 'Assembly.LoadFrom' hoặc tải nó dưới dạng mảng byte chưa? – leppie
Tôi choáng váng. LoadFrom (...) hoạt động, trong khi LoadFile (...) thì không (btw, Load (byte []) cũng không hoạt động). Nếu bạn làm cho nó một câu trả lời tôi có thể cấp cho bạn một đánh dấu. Cảm ơn. –
Trả lời câu hỏi của riêng bạn và nhận được một số đại diện, p – leppie