我正在使用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会解决问题,但这对我来说不是一个选项。有人有主意吗?
谢谢,Marco
EDIT:我不知道它是否有帮助,但我在SqlDependency方面也遇到了同样的问题。开始:将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;
}
可以使用的一个技巧是对包含自定义主体的程序集进行强命名,并将其放入全局程序集缓存。这样,任何应用程序都可以找到所需的程序集,这不是一个理想的解决方案,因为之后必须再次删除它。无论如何,要安装到GAC中,如果您安装了Visual Studio,请运行VS命令提示符并运行以下命令:
gacutil -i nameofassembly.dll
在黑暗中刺伤,但这可能是由于交叉装配而导致的签名事件吗?
这似乎是LinqPad中的序列化问题。我看到Linqpad的创建者Joseph Albahari在您的评论中证实了这一点。
一句话:我们需要在LinqPad中对此进行修复。我不知道周围有什么工作。