2011-07-31 41 views
5

Tôi muốn tải một tệp dll (Test.dll) làm một bộ phận lắp ráp. Tôi có thể làm điều này bằng cách sử dụng cả hai tham chiếu trực tiếp Visual Studio (ví dụ: tải dll như là một tham chiếu đến ứng dụng C# của tôi) cũng như tải dll bằng cách sử dụng phương pháp Assembly.LoadFile(filename). Bây giờ, tôi muốn thêm tệp dll của tôi dưới dạng tài nguyên được nhúng được nhúng vào vào ứng dụng Visual Studio của tôi và tải tệp dll dưới dạng hội đồng. Tôi biết làm thế nào để tải tài nguyên này như là một mảng byte, là có một số tương quan giữa mảng byte và lắp ráp mà tôi có thể sử dụng? Hơn nữa, tôi cần để có thể gọi một phương pháp nằm trong tập tin dll. Xem mã bên dưới - nó sẽ giải thích thêm về những gì tôi đang làm.Tải một bộ phận từ một tài nguyên được nhúng

Assembly SampleAssembly = Assembly.LoadFrom("WindowsFormsApplication2.ThisisaTESTDLL.dll"); 
Type myType = SampleAssembly.GetTypes()[0]; 
MethodInfo Method = myType.GetMethod("myVoid"); 
object myInstance = Activator.CreateInstance(myType,null); 
Method.Invoke(myInstance,new object[] { "param1", "param1"}); 

Nếu tôi thiếu gì ở đây, vui lòng trân trọng thông báo cho tôi và tôi sẽ chỉnh sửa bài đăng gốc.

Trả lời

5

Assembly.GetExecutingAssembly(). GetManifestResourceStream (...)

Điều đó sẽ giúp bạn có được một đối tượng Stream. Bạn có thể đọc một mảng byte từ đó.

Bạn có thể tải rằng việc sử dụng Assembly.Load

+0

Tôi tin rằng tôi đã nêu trong câu hỏi, tôi đã có thể đọc trong một mảng byte, là có một số cách để đọc lắp ráp từ mảng byte này mặc dù? –

+0

Có. Sử dụng Assembly.Load (...) –

+0

đây là nơi mà tôi nghe có vẻ ngu ngốc .... Tôi đọc tài liệu cho Assembly.Load và một trong những "quá tải" nói "byte []". Tại sao, sau đó, khi tôi gõ "Assembly.Load" VS nói "chuỗi" là tham số? Có cách nào để chỉ định không? –

1

tôi nhúng AxInterop.WMPLib.dll và Interop.WMPLib.dll vào exe của tôi và đã cho họ nạp bằng cách sử dụng đoạn mã sau. Mã được đặt ngay tại đầu của static void Main() trong tệp Program.cs. Khung mục tiêu là .NET 3.5 trong trường hợp của tôi. Mã này đã giúp tôi gộp các dll vào bản thân exe mà không cần phải triển khai chúng thông qua trình cài đặt. Tôi đã hardcoded tên của tôi. Trong mã bên dưới "res" là tên của tài nguyên của tôi "res.resx" có chứa hai dll được nhúng.

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler( 
(s, a) => 
{ 
    if (a.Name.Substring(0, a.Name.IndexOf(",")) == "AxInterop.WMPLib") 
    { 
     return Assembly.Load(res.AxInterop_WMPLib); 
    } 

    if (a.Name.Substring(0, a.Name.IndexOf(",")) == "Interop.WMPLib") 
    { 
     return Assembly.Load(res.Interop_WMPLib); 
    } 

    return null; 
} 

);

Các vấn đề liên quan