Podczas powtarzania zestawu zestawów, np. AppDomain.CurrentDomain.GetAssemblies(), zespoły dynamiczne będą generować wyjątek NotSuportedException, jeśli spróbujesz uzyskać dostęp do właściwości takich jak CodeBase. Jak można stwierdzić, że zestaw jest dynamiczny bez wyzwalania i przechwytywania wyjątku NotSupportedException?Jak sprawdzić, czy zestaw .NET jest dynamiczny?
Odpowiedz
Aby sprawdzić, czy zespół jest dynamiczny:
if (assembly.ManifestModule is System.Reflection.Emit.ModuleBuilder)
Zajęło mi trochę czasu, aby dowiedzieć się, więc o to jest pytanie i odpowiedź.
Aktualizacja:
W .NET 4.0, obecnie istnieje właściwość:
if (assembly.IsDynamic)
W .NET 4 można również sprawdzić właściwość Assembly.IsDynamic.
Wreszcie Microsoft zapewnił to :) To jest oczywiście droga, którą należy przejść od teraz. –
Przed .NET Framework 4, najprostszym rozwiązaniem wydaje się być sprawdzenie, czy Assembly jest typu System.Reflection.Emit.AssemblyBuilder. To jest rozwiązanie, którego używamy w naszym zespole.
Jeśli przyjrzeć się implementacji właściwości CodeBase AssemblyBuilder, po prostu zgłasza wyjątek, niezależnie od czegokolwiek innego. AssemblyBuilder jest również klasą zapieczętowaną, więc klasa pochodna nie może zmienić tego zachowania. Tak więc, jeśli masz obiekt AssemblyBuilder, możesz być pewien, że nigdy nie możesz wywołać CodeBase lub GetManifestResourceStream lub kilku innych metod.
public override string CodeBase
{
get
{
throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicAssembly"));
}
}
A w .NET Framework 4, sprawdzając właściwość Assembly.IsDynamic powinny być korzystne, ponieważ jest to bardziej czytelne i być może bardziej przyszłościowe, w przypadku niektórych nowa klasa przychodzi który nadpisuje IsDynamic. Ponieważ AssemblyBuilder.IsDynamic zawsze zwraca wartość true, jest to więcej dowodów na to, że obiekt AssemblyBuilder jest zawsze równoważny z "dynamiczną biblioteką dll".
Oto .NET 4 AssemblyBuilder za IsDynamic:
public override bool IsDynamic
{
get {
return true;
}
}
- 1. Jak sprawdzić, czy dynamiczny jest pusty.
- 2. Jak sprawdzić, czy obiekt dynamiczny jest tablicą w języku C#?
- 3. Jak sprawdzić, czy zestaw słuchawkowy jest podłączony, czy nie?
- 4. Python, jak sprawdzić, czy zestaw wyników jest pusty?
- 5. Jak bezpiecznie sprawdzić, czy obiekt dynamiczny ma pole, czy nie?
- 6. Jak sprawdzić, czy jest zainstalowany dodatek .NET 3.5 SP1?
- 7. Jak sprawdzić, czy skaner jest podłączony (C#, .NET TWAIN)?
- 8. Jak sprawdzić, czy typ jest abstrakcyjny w .NET Core?
- 9. C# .NET: Jak sprawdzić, czy używamy baterii?
- 10. Jak sprawdzić, czy program korzysta z .NET?
- 11. Jak sprawdzić, czy typ jest klasą?
- 12. Obiekt dynamiczny - Jak określić, czy właściwość jest zdefiniowana?
- 13. Jak sprawdzić, kiedy zestaw zadań RabbitMQ jest kompletny?
- 14. Iphone Jak sprawdzić, czy zestaw słuchawkowy Bluetooth podłączony
- 15. Jak sprawdzić, czy jest konsola?
- 16. Jak sprawdzić, czy tablica jest pusta?
- 17. Jak sprawdzić zestaw znaków w Java?
- 18. Jak sprawdzić, czy jeden typ .NET implementuje pewien interfejs .NET w sposób abstrakcyjny?
- 19. Czy możliwe jest zastrzyki przez dynamiczny LINQ?
- 20. Czy można przetestować zestaw narażonych COM z .NET?
- 21. Jak zarejestrować zestaw .NET jako COM?
- 22. Jak utworzyć zestaw .NET 4.0 w projektach .NET 3.5
- 23. Czy DLR jest potrzebny w .NET 4.0?
- 24. Jak przetestować istniejący plik .NET .dll, aby sprawdzić, czy jest on 32-bitowy czy 64-bitowy?
- 25. Jak sprawdzić, czy MethodInfo interfejsu jest metodą "nowego"
- 26. Jak sprawdzić, czy przesyłanie ftp za pośrednictwem ruby jest sukcesem?
- 27. Jak sprawdzić, czy plik istnieje w C#/.NET?
- 28. jak sprawdzić, czy 2 pliki są równe przy użyciu .NET?
- 29. Jak mogę sprawdzić, czy kolejka jest pusta?
- 30. Jak sprawdzić, czy alarm jest ustawiony?
Nie całkiem poprawne. Konstruktor modułów może być "niedynamiczny". Powinieneś użyć 'ModuleBuilder.IsTransient', aby sprawdzić 'dynamic'. – leppie