2009-02-21 39 views
6

có ai biết làm thế nào tôi có thể nhúng một tệp exe vào một dll?Nhúng * .exe vào một dll

Tôi có một công cụ là tệp exe mà tôi gọi từ mã C#.

Điều này là tôi muốn có 1 dll chứa công cụ này (tệp exe) và dll tiếp tục mã C# của tôi.

Có thể nhúng tệp exe này vào tài nguyên không?

Thx trước

+0

Tôi đã xóa thẻ "được nhúng" vì câu hỏi này không thực sự liên quan đến các hệ thống nhúng. –

Trả lời

9

Chắc chắn vậy. Bạn có thể thêm bất kỳ tệp nào dưới dạng RC_DATA trong ứng dụng dưới dạng tài nguyên. Nhưng tôi tin rằng bạn sẽ cần phải giải nén nó vào đĩa trước khi gọi nó!

IDE/ngôn ngữ nào bạn đang sử dụng?

[EDIT]

Xin lỗi! bạn đã đề cập rằng bạn đang sử dụng C#.

  1. Thêm một tập tin tài nguyên để bạn ứng dụng (nhấn chuột phải ứng dụng trong IDE và chọn "Thêm mục mới".
  2. Sử dụng thanh công cụ trong trình soạn thảo tài nguyên để thêm một tập tin hiện có.
  3. Sau đó giải nén exe bất cứ khi nào theo yêu cầu của gọi mã gì đó như: System.IO.File.WriteAllBytes (@ "C: \ MyEXE \", Resource1.MyEXE);
+1

Các quy tắc đi, ngoại trừ, bạn có thể tải một hội từ một byte [], vì vậy không cần phải tạo tệp. – leppie

+0

Các quy tắc tương tự, .... (oops typo) – leppie

+0

thx cho câu trả lời của bạn Vì vậy, cuối cùng, tôi sẽ cần phải viết nó trên hệ thống tập tin để thực hiện nó không? không có khả năng để thực hiện nó mà không làm điều này? – GillouX

7

Nó có giá trị trần bộ nhớ rằng sử dụng của bạn có thể không quá hạnh phúc về bạn làm điều này. Nhúng một thực thi mà họ đã không có kiểm soát vào một DLL mà bạn sẽ giải nén và chạy có thể sẽ làm cho mọi người lo lắng về việc chạy một Trojan trên máy tính của họ.

Tốt hơn nên thoát khỏi .EXE trong hệ thống tệp và minh bạch về những gì ứng dụng của bạn đang làm.

+5

Đây không thực sự là một mối quan tâm hợp lệ. Nếu một người dùng đang chạy DLL của tôi, họ rõ ràng là tôi tin tưởng. Bên cạnh đó có bao giờ bạn nhìn vào tất cả các tập tin thực thi trợ giúp được đưa ra bởi các ứng dụng bạn sử dụng? – tster

2

Bạn có thể tải một Assembly từ một byte []. Điều này có thể thu được thông qua ManifestResourceStream của một tài nguyên nhúng.

1

Một giải pháp thay thế có thể không được nhúng chính .exe, nhưng thay vào đó bao gồm chức năng của nó trong dll và sử dụng rundll32 [1] để thực thi nó.

+0

Đó cũng là sự lựa chọn của tôi ... cho đến khi tôi đọc bài viết cũ này: [Hướng dẫn sử dụng rundll32 là gì? Dễ dàng: Không sử dụng nó] (http://blogs.msdn.com/b/oldnewthing/archive/2013/01/04/10382242.aspx) –

+0

@ VáclavSlavík: liên kết bị hỏng; [đây là cái mới] (https://blogs.msdn.microsoft.com/oldnewthing/20130104-00/?p=5643). – hydroiodic

-1

Trên một lưu ý phụ, hãy nhớ rằng khi bạn kéo tệp từ tài nguyên của mình vào đĩa rồi thực thi mã trên đó, bạn có thể kích hoạt Windows Data Execution Prevention - về cơ bản, Windows sẽ cố gắng tự động phát hiện xem nội dung nào đó là mã hoặc dữ liệu , và nếu nó trông giống như dữ liệu (mà một tài nguyên sẽ), thì nó sẽ ngăn chặn dữ liệu đó được thực hiện như mã.

Điều này trở thành vấn đề đặc biệt nếu cụm .NET của bạn được sử dụng trên mạng thay vì từ ổ đĩa cục bộ - có tất cả các loại cấu hình bảo mật .NET có thể ngăn điều này hoạt động chính xác.

Một tùy chọn khác và không biết chi tiết dự án của bạn, hãy thực hiện điều này với một hạt muối: thêm tệp .exe.readme vào bản cài đặt mô tả cho bất kỳ người dùng tò mò hoặc người CNTT nào tại sao có một tệp thực thi Không mong đợi trong thư mục cài đặt :)

+0

Đó là một ... mô tả thú vị nhầm lẫn của DEP. Không, DEP thực sự sẽ không gắn thẻ các tệp thực thi trên đĩa một cách kỳ diệu khi đến từ một ngã ba tài nguyên và do đó không thực thi được. Và không, DEP không "cố" để "phát hiện" bất cứ điều gì. Thay vào đó, đó là một cơ chế để gắn thẻ các trang bộ nhớ là thực thi hoặc không thực thi được. –

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