linqpad和自定义IPrincipal可序列化

时间:2012-07-13 14:02:00

标签: c# linqpad serializable 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#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;
}

3 个答案:

答案 0 :(得分:0)

在黑暗中刺伤但是由于穿越组件可能是签名的东西吗?

答案 1 :(得分:0)

这似乎是LinqPad中的序列化问题。我看到Linqpad的创建者Joseph Albahari在你的评论中证实了这一点。

结论:我们需要在LinqPad中修复此问题。我不知道有任何解决方法。

答案 2 :(得分:0)

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

gacutil -i nameofassembly.dll