Độc thân hội Triển khai quản lý, Switch Mã Chủ Nhật 4 Tháng Hai, 2007
NET nhà phát triển yêu triển khai xcopy. Và họ yêu thích các thành phần lắp ráp đơn lẻ. Ít nhất tôi luôn cảm thấy không thoải mái, nếu tôi phải sử dụng một số thành phần và cần nhớ một danh sách các tệp cũng bao gồm với assembly chính của thành phần đó. Vì vậy, khi gần đây tôi đã phát triển một thành phần mã được quản lý và phải tăng thêm một số mã không được quản lý từ một DLL C (thx tới Marcus Heege để giúp tôi với điều này!), Tôi đã nghĩ về cách làm thế nào để triển khai hai tệp DLL dễ dàng hơn . Nếu đây chỉ là hai hội chúng tôi có thể đã sử dụng ILmerge để đóng gói chúng chỉ trong một tập tin. Nhưng điều này không làm việc cho các thành phần mã hỗn hợp với các DLL được quản lý cũng như không được quản lý.
Vì vậy here's những gì tôi đã đưa ra một giải pháp:
tôi bao gồm bất cứ điều gì DLL tôi muốn triển khai với component's tôi lắp ráp chính là nguồn lực nhúng. Sau đó, tôi thiết lập một hàm tạo lớp để trích xuất các tệp DLL như dưới đây. Các ctor lớp được gọi là chỉ một lần trong mỗi AppDomain vì vậy nó là một chi phí đáng tin cậy, tôi nghĩ.
namespace MyLib
{
public class MyClass
{
static MyClass()
{
ResourceExtractor.ExtractResourceToFile("MyLib.ManagedService.dll", "managedservice.dll");
ResourceExtractor.ExtractResourceToFile("MyLib.UnmanagedService.dll", "unmanagedservice.dll");
}
...
Trong ví dụ này tôi bao gồm hai DLL như nguồn lực, một là một DLL unmanaged code, và một là một DLL mã số quản lý (chỉ dành riêng cho mục đích biểu tình), để hiển thị, làm thế nào kỹ thuật này làm việc cho cả hai loại mã .
Mã để giải nén các file DLL vào các tập tin của riêng mình rất đơn giản:
public static class ResourceExtractor
{
public static void ExtractResourceToFile(string resourceName, string filename)
{
if (!System.IO.File.Exists(filename))
using (System.IO.Stream s = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create))
{
byte[] b = new byte[s.Length];
s.Read(b, 0, b.Length);
fs.Write(b, 0, b.Length);
}
}
}
Làm việc với một hội đồng quản lý mã như thế này là như nhau như thường lệ - gần. Bạn tham chiếu nó (ở đây: ManagedService.dll) trong dự án chính của thành phần của bạn (ở đây: MyLib), nhưng đặt thuộc tính Sao chép Địa phương thành sai. Ngoài ra bạn liên kết trong assembly như một mục hiện có và thiết lập Build Action thành Embedded Resource.
Đối với mã không được quản lý (ở đây: UnmanagedService.dll) bạn chỉ cần liên kết trong DLL dưới dạng Mục hiện có và đặt Hành động Xây dựng thành Tài nguyên được nhúng. Để truy cập các chức năng của nó, hãy sử dụng thuộc tính DllImport như bình thường, ví dụ:
[DllImport("unmanagedservice.dll")] public extern static int Add(int a, int b);
Đó là điều đó! Ngay sau khi bạn tạo cá thể đầu tiên của lớp với ctor tĩnh, các DLL nhúng được trích xuất thành các tệp của riêng chúng và sẵn sàng sử dụng như thể bạn đã triển khai chúng dưới dạng các tệp riêng biệt. Miễn là bạn có quyền ghi cho thư mục thực thi, điều này sẽ làm việc tốt cho bạn. Ít nhất là đối với mã nguyên mẫu, tôi nghĩ cách triển khai lắp ráp đơn này khá thuận tiện.
Tận hưởng!
http://weblogs.asp.net/ralfw/archive/2007/02/04/single-assembly-deployment-of-managed-and-unmanaged-code.aspx
Bạn nên sử dụng BoxedAppPacker hoặc BoxedApp SDK. Nó phải giúp đỡ. – MastAvalons
Bản sao của http://stackoverflow.com/questions/666799/embedding-unmanaged-dll-into-a-managed-c-sharp-dll/11038376#11038376 –