Mam niepoprawne pliki DLL innych firm, które po pewnym czasie wykonywania zaczynają wyrzucać wyjątki naruszenia dostępu. Kiedy tak się stanie, chcę przeładować ten plik DLL. Jak mogę to zrobić?Jak dynamicznie ładować i usuwać macierzysty plik DLL?
Odpowiedz
Spróbuj
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr LoadLibrary(string libname);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern bool FreeLibrary(IntPtr hModule);
//Load
IntPtr Handle = LoadLibrary(fileName);
if (Handle == IntPtr.Zero)
{
int errorCode = Marshal.GetLastWin32Error();
throw new Exception(string.Format("Failed to load library (ErrorCode: {0})",errorCode));
}
//Free
if(Handle != IntPtr.Zero)
FreeLibrary(Handle);
Jeśli chcesz wywołać funkcje najpierw należy utworzyć delegeate który odpowiada tej funkcji a następnie użyć WinAPI GetProcAddress
[DllImport("kernel32.dll", CharSet = CharSet.Ansi)]
private static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
IntPtr funcaddr = GetProcAddress(Handle,functionName);
YourFunctionDelegate function = Marshal.GetDelegateForFunctionPointer(funcaddr,typeof(YourFunctionDelegate)) as YourFunctionDelegate ;
function.Invoke(pass here your parameters);
A jak wywołać moje funkcje dll? Kiedy deklaruję je jako 'DllImport', to podejście nie działa – Poma
Czy to rozwiązałeś? Czy możesz podać fragment kodu natywnego kodu? w jaki sposób powinien zostać zadeklarowany kod natywny i jak wygląda delegat? Dzięki – freshWoWer
@Poma Czy to działa? Czy możesz mi powiedzieć, jak uzyskać działanie GetDelegateForFunctionPointer? – GuidoG
Utwórz proces roboczy, który komunikuje się poprzez COM lub kolejny mechanizm IPC. Następnie, gdy plik DLL umiera, możesz po prostu ponownie uruchomić proces roboczy.
Załaduj plik dll, wywołaj go, a następnie usuń, aż zniknie.
Dostosowałem następujący kod z przykładu VB.Net here.
[DllImport("powrprof.dll")] static extern bool IsPwrHibernateAllowed(); [DllImport("kernel32.dll")] static extern bool FreeLibrary(IntPtr hModule); [DllImport("kernel32.dll")] static extern bool LoadLibraryA(string hModule); [DllImport("kernel32.dll")] static extern bool GetModuleHandleExA(int dwFlags, string ModuleName, ref IntPtr phModule); static void Main(string[] args) { Console.WriteLine("Is Power Hibernate Allowed? " + DoIsPwrHibernateAllowed()); Console.WriteLine("Press any key to continue..."); Console.ReadKey(); } private static bool DoIsPwrHibernateAllowed() { LoadLibraryA("powrprof.dll"); var result = IsPwrHibernateAllowed(); var hMod = IntPtr.Zero; if (GetModuleHandleExA(0, "powrprof", ref hMod)) { while (FreeLibrary(hMod)) { } } return result; }
- 1. Jak dynamicznie ładować zasobę R.styleable?
- 2. Jak dynamicznie ładować plik wykonywalny ELF do relokacji?
- 3. Jak dynamicznie ładować plik javascript z innej domeny?
- 4. dynamicznie dodawać i usuwać widok na viewpager
- 5. Jak dynamicznie usuwać pola z wyjścia serializatora
- 6. JBoss 7: jak dynamicznie ładować słoiki
- 7. Jak dynamicznie ładować klasę w Objective-C?
- 8. Jak dynamicznie dodawać i usuwać css dla całej aplikacji JavaFX?
- 9. Jak dynamicznie dodawać i usuwać pola formularza w Angular 2
- 10. Jak wykonać plik * .dll
- 11. Jak ładować plik php jeden po drugim?
- 12. Jak dynamicznie ładować czcionkę pod iOS. (na prawdę)
- 13. Generowanie zespołu DLL dynamicznie w czasie wykonywania
- 14. Jak ładować reguły CSS dynamicznie w Webkit (Safari/Chrome)?
- 15. Jak dynamicznie ładować klasę Java bez użycia programu ładującego klasy?
- 16. Jak ładować komponent dynamicznie za pomocą nazwy komponentu w angular2?
- 17. Jak dynamicznie ładować wiele szablonów za pomocą AngularJS?
- 18. Jak dynamicznie dodawać i usuwać zagnieżdżone pola modelu za pomocą Haml i Formtastic
- 19. WPF Dynamicznie zmieniaj plik zasobu i motyw
- 20. Jak utworzyć plik JAR zawierający pliki DLL?
- 21. Extjs nie może dynamicznie dodawać/usuwać pól w formpanelu
- 22. Jak przekonwertować aplikację konsoli na plik .dll?
- 23. Jak zarejestrować plik .NET DLL w GAC?
- 24. Dynamicznie ładuje plik XML do Linearlayout
- 25. Jak debugować plik DLL w Delphi
- 26. utworzyć plik DLL w C#
- 27. Jak dynamicznie ładować HTML i wstawiać do mojej strony za pomocą Dart?
- 28. Jak usuwać pliki rekurencyjnie
- 29. Czy mogę dynamicznie usuwać wartości instancji typu struct w golang?
- 30. Jak znaleźć katalog macierzysty ścieżki?
Jak o ładowaniu dll do procesu proxy i zakończyć cały proces? Zwykle proces jest uznawany za uszkodzony po naruszeniu dostępu. – CodesInChaos
Jak to zrobić? Niewiele słyszałem o AppDomains. Czy możesz podać przykład? – Poma
Ponieważ jest to natywna biblioteka dll AppDomains nie pomoże. Trzeba mieć drugi proces, który ładuje bibliotekę dll, a następnie wykorzystuje pewną formę komunikacji między procesami do przesyłania połączeń między procesami. Zdalne .net może być jednym ze sposobów. Ale sam tego nie zrobiłem. – CodesInChaos