2009-02-21 10 views
6

czy ktoś wie, jak mogę umieścić plik exe w dll?Wbudowany * .exe do dll

Mam narzędzie, które jest plik exe, które wywołuję z kodu C#.

Chodzi o to, że chcę mieć 1 dll zawierający to narzędzie (plik exe) i bibliotekę dll zawierającą mój kod C#.

Czy jest możliwe umieszczenie tego pliku exe w zasobach?

Thx z góry

+0

Usunąłem tag" osadzony ", ponieważ to pytanie nie jest tak naprawdę związane z systemami wbudowanymi. –

Odpowiedz

9

Pewnie, że tak. Możesz dodać dowolny plik jako RC_DATA w aplikacji jako zasób. Ale uważam, że będziesz musiał najpierw wyodrębnić go na dysk przed wywołaniem go!

Którego IDE/języka używasz?

[EDIT]

Przepraszamy! wspomniałeś, że używasz C#.

  1. Dodaj plik zasobów do ciebie aplikacji (kliknij prawym przyciskiem myszy aplikację w IDE i wybierz „Dodaj nowy element”.
  2. korzystać z paska narzędzi w edytorze zasobów, aby dodać istniejący plik.
  3. Następnie ekstrahować exe ilekroć wymagane przez wywołanie kodu coś takiego: System.IO.File.WriteAllBytes (@ "C: \ MyEXE \", Resource1.MyEXE);
+1

Reguły się udają, z wyjątkiem tego, że możesz wczytać Assembly z bajtu [], więc nie musisz tworzyć pliku. – leppie

+0

Te same zasady obowiązują ... (oops litero) – leppie

+0

thx za odpowiedź Tak na koniec, musiałbym napisać to na systemie plików, aby go wykonać mimo to? nie ma możliwości wykonania tego bez robienia tego? – GillouX

7

warto obnażając na uwadze, że zastosowania nie może być zbyt Cieszę się, że to robisz. Osadzenie pliku wykonywalnego, który nie ma żadnej kontroli nad biblioteką DLL, którą wyodrębnisz i uruchomisz, prawdopodobnie spowoduje, że ludzie będą martwić się o uruchomienie trojana na swoim komputerze.

Lepiej jest zostawić .EXE w systemie plików i być przejrzystym na temat tego, co robi aplikacja.

+5

To naprawdę nie jest uzasadniona troska. Jeśli użytkownik uruchamia moją bibliotekę DLL, oczywiście mi ufają. Poza tym, czy kiedykolwiek przeglądałeś wszystkie programy pomocnicze uruchamiane przez używane aplikacje? – tster

2

Możesz załadować zespół z bajtu []. Można to uzyskać poprzez ManifestResourceStream osadzonego zasobu.

1

Alternatywą może być nie umieszczanie samego pliku .exe, ale raczej włączenie jego funkcjonalności do biblioteki dll i użycie rundll32 [1] w celu jego wykonania.

+0

To byłby również mój wybór ... dopóki nie przeczytam tego postu The Old New Thing: [Jakiego poradnika użyć kiedy używać rundll32? Łatwe: nie używaj go] (http://blogs.msdn.com/b/oldnewthing/archive/2013/01/04/10382242.aspx) –

+0

@ VáclavSlavík: link uszkodzony; [tutaj jest nowy] (https://blogs.msdn.microsoft.com/oldnewthing/20130104-00/?p=5643). – hydroiodic

-1

Na marginesie pamiętaj, że po pobraniu pliku z zasobów na dysk, a następnie wykonaniu na nim kodu, możesz uruchomić system Windows Data Execution Prevention - w zasadzie system Windows próbuje automatycznie wykryć, czy coś ma być kodem lub danymi , a jeśli wygląda na dane (które byłyby zasobami), to uniemożliwi wykonanie tych danych jako kodu.

Jest to szczególnie kłopotliwy problem, jeśli zestaw .NET będzie używany w sieci zamiast na dysku lokalnym - istnieją różne rodzaje konfiguracji zabezpieczeń .NET, które mogą uniemożliwić prawidłowe działanie.

Inna opcja, a nie znając szczegółów projektu, podejmij to z przymrużeniem oka: dodaj plik .exe.readme do swojej instalacji, który opisuje ciekawym użytkownikom lub informatykom, dlaczego istnieje plik wykonywalny, który nie był "Oczekuję w katalogu instalacyjnym :)

+0

To jest ... ciekawie pomieszany opis DEP. Nie, DEP naprawdę nie magicznie oznaczy pliki wykonywalne na dysku jako pochodzące z widelca zasobów, a więc nie jest możliwe do wykonania. I nie, DEP nie "próbuje" niczego "wykryć". Zamiast tego jest to mechanizm oznaczania stron pamięci jako wykonywalny lub niewykonywalny. –