我正在使用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#Program as Language)中运行此代码时,我得到以下异常
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.Start相同的问题:将Serializable放在IPrincipal上使得框架抛出错误抱怨它可以找不到定义IPrincipal类型的程序集。我用一个可耻的黑客解决了:
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;
}
答案 0 :(得分:0)
在黑暗中刺伤但是由于穿越组件可能是签名的东西吗?
答案 1 :(得分:0)
这似乎是LinqPad中的序列化问题。我看到Linqpad的创建者Joseph Albahari在你的评论中证实了这一点。
结论:我们需要在LinqPad中修复此问题。我不知道有任何解决方法。
答案 2 :(得分:0)
您可以使用的一个技巧是强制命名包含自定义主体的程序集,并将其放入全局程序集缓存中。这样任何应用程序都可以找到你想要的程序集,它不是一个理想的解决方案,因为你必须在之后再次删除它。无论如何,如果安装了Visual Studio,要安装到GAC中,请运行VS命令提示符并运行以下命令:
gacutil -i nameofassembly.dll