Действительно ли возможно загрузить две версии времени выполнения.NET в том же процессе?

Следующее решение использует TextBox для отображения пароля в виде обычного текста и PasswordBox для маскировки пароля. PasswordBox находится над TextBox, поэтому сначала вы увидите замаскированный пароль. Когда флажок «показать пароль» установлен, PasswordBox скрыт, что показывает TextBox внизу (и пароль в виде обычного текста). Вот XAML:

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="VisibilityConverter" />
</Window.Resources>

<StackPanel>
    <Grid>
        <TextBox
            Text="{Binding Password, UpdateSourceTrigger=PropertyChanged}"
            />
        <PasswordBox
            x:Name="PasswordBox"
            PasswordChanged="OnPasswordChanged"
            Visibility="{Binding HidePassword, Converter={StaticResource VisibilityConverter}}"
            />
    </Grid>
    <CheckBox
        Content="Show password"
        IsChecked="{Binding ShowPassword}"
        />
</StackPanel>

Он не использует MVVM для всего (обратите внимание на обработчик событий OnPasswordChanged). Это потому, что PasswordBox не может использовать привязку, поэтому пароль должен быть установлен в коде позади. Но прежде чем показать это, вот модель представления:

public class ViewModel : ViewModelBase
{
    private string _password;
    public string Password
    {
        get => _password;
        set => Set(ref _password, value);
    }

    private bool _showPassword;
    public bool ShowPassword
    {
        get => _showPassword;
        set
        {
            Set(ref _showPassword, value);
            RaisePropertyChanged(nameof(HidePassword));
        }
    }

    public bool HidePassword => !ShowPassword;
}

Методы Set происходят из родительского класса ViewModelBase, который является частью легкого инструментария MVVM. Метод Set просто устанавливает поле поддержки свойства и вызывает событие PropertyChanged для этого свойства.

Наконец, вот код:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        InitializeViewModel();
    }

    public ViewModel ViewModel => DataContext as ViewModel;

    private void InitializeViewModel()
    {
        DataContext = new ViewModel();

        ViewModel.PropertyChanged += (sender, args) =>
        {
            // Update the password box only when it's not visible;
            // otherwise, the cursor goes to the beginning on each keystroke
            if (!PasswordBox.IsVisible)
            {
                if (args.PropertyName == nameof(ViewModel.Password))
                    PasswordBox.Password = ViewModel.Password;
            }
        };
    }

    private void OnPasswordChanged(object sender, RoutedEventArgs e)
    {
        ViewModel.Password = PasswordBox.Password;
    }
}

После установки для DataContext нового ViewModel, мы слушаем изменения в свойстве Password, чтобы обновить его в [ 1118]. Обратите внимание, что мы делаем это только тогда, когда PasswordBox не виден (в противном случае курсор устанавливается на начало при каждом нажатии клавиши, и мы в конечном итоге возвращаем пароль!)

Обработчик событий просто обновляет [ 1120] в модели представления всякий раз, когда она изменяется в PasswordBox.

Код для «подтверждения пароля» TextBox и PasswordBox будет очень похожим.

5
задан Gulzar Nazim 15 October 2008 в 00:48
поделиться

3 ответа

Нет - Вы не можете загрузить CLR в тот же процесс дважды. См. документацию для Хостинга CLR

Как с более ранними версиями времени выполнения, функция CorBindToRuntimeEx инициализирует время выполнения. Можно выбрать, какую версию времени выполнения загрузить, но процесс может разместить только одну версию.

7
ответ дан 13 December 2019 в 05:44
поделиться

Для случая № 1, там какая-либо конкретная причина (скажите, повредив изменения), который требует, чтобы библиотека была размещена в 1,1 временах выполнения? Действительно ли возможно подвергнуть библиотеку через 1.1 скомпилированный веб-сервис и иметь исполняемую точку к веб-сервису вместо этого? (Или некоторый другой метод дистанционной работы, для получения библиотеки в ее собственном процессе?)

Для случая № 2 действительно ли возможно перекомпилировать 1,1 приложения под 2.0/3.5, таким, что он может находиться в том же процессе?

В любом случае Rob Walker прав (и я upvoted) - Вы просто не можете разместить 2 версии времени выполнения в том же процессе. Таким образом, необходимо работать вокруг этого так или иначе. Я предположил бы, что в обоих случаях, источник должен быть доступным, таким образом, перекомпиляции и перетестирование должны играть.

2
ответ дан 13 December 2019 в 05:44
поделиться

. СЕТЕВЫЕ 4 обещания включить разместить различных версий CLR в том же процессе посредством Незавершенный Рядом .

3
ответ дан 13 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: