gpt4 book ai didi

c# - linqpad 和自定义 IPrincipal 可序列化

转载 作者:太空狗 更新时间:2023-10-29 22:01:25 25 4
gpt4 key购买 nike

我正在使用 LINQPad 测试代码(我必须说这是一个多么棒的产品)但是现在当我尝试将 Thread.CurrentPrincipal 设置为标有 SerializableAttribute 的自定义 IPrincipal 时遇到异常按照演示问题的示例

void Main()
{
Thread.CurrentPrincipal = new MyCustomPrincipal();
}

// Define other methods and classes here
[Serializable]
public class MyCustomPrincipal : IPrincipal
{
public bool IsInRole(string role)
{
return true;
}

public IIdentity Identity
{
get
{
return new WindowsIdentity("RECUPERA\\m.casamento");
}
}
}

当我在 LINQPad(C# 程序作为语言)中运行此代码时,出现以下异常

Type is not resolved for member 'UserQuery+MyCustomPrincipal,query_nhxfev, Version=0.0.0.0, 
Culture=neutral, PublicKeyToken=null'
RuntimeMethodInfo: PluginWindowManager.get_Form ()

如果我删除 Serializable 属性,一切都会正常进行。问题似乎与 LINQPad 使用的 AppDomain 架构有关,并且框架无法找到定义 MyCustomPrincipal 的程序集。此外,我相信将 MyCustomPrincipal 定义到另一个程序集中并将其放入 GAC 中可以解决问题,但这不是我的选择。有人有想法吗?

谢谢,马可

编辑:我不知道它是否有帮助,但我在使用 SqlDependency 时遇到了同样的问题。开始:将 Serializable 放在 IPrincipal 上会使框架抛出一个错误,提示它可以' 找到定义 IPrincipal 类型的程序集。我用一个可耻的 hack 解决了问题:

System.Security.Principal.IPrincipal principal;
principal = System.Threading.Thread.CurrentPrincipal;

System.Threading.Thread.CurrentPrincipal = null;
try
{
SqlDependency.Start(connectionString);
m_SqlDependencyStarted = true;
}
catch (Exception ex)
{
throw (ex);
}
finally
{
System.Threading.Thread.CurrentPrincipal = principal;
}

最佳答案

您可以使用的一个技巧是强命名包含自定义主体的程序集并将其放入全局程序集缓存中。这样任何应用程序都可以找到您想要的程序集,这不是一个理想的解决方案,因为之后您将不得不再次删除它。如果您安装了 Visual Studio,无论如何要安装到 GAC 中,请运行 VS 命令提示符并运行以下命令:

gacutil -i nameofassembly.dll

关于c# - linqpad 和自定义 IPrincipal 可序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11472033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com