У меня есть приложение, скомпилированное с помощью .Net Framework 4.0, и я хочу загрузить в него WPF UserControl.
Пользовательский элемент управления представляет собой dll, скомпилированную для .NetFramework 4.8.
Я провел несколько тестов с консольным приложением и загрузил из .NetFramework 4.0 dll, используя отражение. dll скомпилирована с .NetFramework 4.8 и с использованием, например, конструктора RSA, представленного в .NetFramework 4.7.
Таргетинг на консольные приложения .NetFramework 4.0
static void Main()
{
var path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "DependencyDll.dll");
var assembly = Assembly.LoadFile(path);
var type = assembly.GetType("Crypto");
var typeInstance = Activator.CreateInstance(type);
var method = type.GetMethod("Encrypt");
var text = (string) method.Invoke(typeInstance, new object[]{"Hellooooo"});
Console.WriteLine(text);
}
Таргетинг Dll библиотеки классов .NetFramework 4.8
public class Crypto
{
public string Encrypt(string text)
{
using(var rsa = RSA.Create(2048))
{
var bytes = rsa.Encrypt(Encoding.UTF8.GetBytes(text), RSAEncryptionPadding.OaepSHA512);
var decrypt = rsa.Decrypt(bytes, RSAEncryptionPadding.OaepSHA512);
return Encoding.UTF8.GetString(decrypt);
}
}
}
В этом примере кажется, что все работает хорошо, без проблем во время выполнения.
Это разрешено или, может быть, у меня возникнут проблемы? Я думал, что это не удастся из-за того, что исполняющая или вызывающая сборка была скомпилирована в .Net Framework 4.0.
@GuyVdN Приложение должно поддерживаться в более старых системах, таких как Windows XP, и приложение также не разработано мной. Я разрабатываю только dll UserControl. Приложение работает в неподключенной среде, поэтому риск безопасности ограничен.





Is this permited or maybe I will have some problem?
Да. Каждая версия .NET Framework выше 4.0 представляет собой обновление 4.0 на месте. Каждая более поздняя версия полностью заменяет предыдущую версию на машине.
Вы по-прежнему можете использовать цель .NET Framework 4.0 с библиотекой классов, но все, что нужно сделать, это указать, что вы используете API .NET Framework 4.0. Однако если вы используете более позднюю версию .NET Framework время выполнения, она будет работать с более новой версией .NET Framework. По сути, он переходит в режим совместимости, который сохраняет поведение .NET Framework 4.0, но на самом деле работает в более новой версии .NET Framework.
Что касается цель .NET Framework 4.0, это другой вопрос. Хотя верно, что Microsoft больше не поддерживает .NET Framework 4.0, нет абсолютно никаких причин, по которым вы не можете ориентироваться на .NET Framework 4.0, если приложение, использующее его, использует версию .NET Framework, которая все еще поддерживается. Основное отличие заключается в том, что пользователи, которые по какой-либо причине застряли на старой версии, по-прежнему смогут использовать вашу библиотеку классов, где, если вы нацелитесь на более новую версию, те, кто застрял на .NET Framework 4.0 (а есть много возможных причин, почему это могло произойти), выиграют. t иметь доступ к вашей библиотеке.
При этом не рекомендуется запускать приложение, предназначенное для неподдерживаемой версии .NET Framework. Список поддерживаемых версий .NET Framework см. в статье https://docs.microsoft.com/en-us/lifecycle/faq/dotnet-framework. Может показаться, что это противоречит тому, что я только что сказал, но есть разница между таргетинг .NET Framework 4.0 и Бег .NET Framework 4.0.
Спасибо за ваш комментарий. Не могли бы вы немного пояснить второй абзац, потому что конец не так ясен для меня? Я разрабатываю dll .NetFw4.8, который используется в приложении .NetFw 4.0. Ссылка на dll в Visual Studio не разрешена, но ее загрузка с помощью отражения не вызывает проблем. Остальное для меня ясно. Спасибо!
Я добавил в свой вопрос полный пример, чтобы прояснить мой пример, который работает без проблем.
Невозможно ссылаться на версию новее .NET Framework, используя более старую версию. Как вы обнаружили, это можно сделать с помощью Reflection, но это далеко не идеально. Вместо этого я бы порекомендовал также обновить ваше консольное приложение до .NET Framework 4.8 (даже если это может потребовать изменения не только целевой платформы).
Вы не можете обновить свое приложение до .NET Framework 4.8? Поддержка 4.0 была прекращена 12 января 2016 г., поэтому не рекомендуется продолжать использовать ее, поскольку с тех пор не было обновлений или исправлений безопасности. Дополнительную информацию о жизненных циклах можно найти здесь: docs.microsoft.com/en-us/lifecycle/products/….