linqpad和自定义IPrincipal可串行化



我正在使用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中对此进行修复。我不知道周围有什么工作。

最新更新