Вы сражаетесь с чем-то, что называется «контекстом вызова» в .NET Framework. Мне нужно немного помахать руками, потому что я не совсем понимаю. Основная предпосылка заключается в том, что нынешний принципал - это большое дело в безопасности .NET. Это позволяет работать в песочнице, помогая изолировать код, чтобы он не делал ничего опасного. Код работает в браузере, телефоне, плагине и тому подобное.
Текущий участник связан с потоком, свойством Thread.CurrentPrincipal. Это делает Control.Begin / Invoke () хитрым, какой-то плагин может захватить права основного потока программы, используя его для запуска кода в этом потоке. Контекст вызова является контрмерой против этого. Ваш код обновляет принцип контекста вызова, а не поток. После завершения вызванного вызова, который попадает в область битов, он не возвращается обратно в исходный поток в случае Control.Invoke ().
Нахождение обходного пути для этого ошеломляет меня прямо сейчас. Это действительно должен быть код, который исходит из вашего основного потока, который устанавливает свойство, ничего, что бы не вызывалось. Я могу думать только о глупом исправлении, используя таймер на одну миллисекунду:
Private Sub setPrincipal()
Timer1.Enabled = True
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Timer1.Enabled = False
My.User.CurrentPrincipal = New CustomPrincipal
MsgBox(My.User.CurrentPrincipal.Identity.AuthenticationType) ' Custom
End Sub
Это работает. Остерегайтесь возможной расы.