6

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

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.Start 上遇到了同样的问题:将 Serializable 放在 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;
}
4

3 回答 3

0

在黑暗中刺伤,但由于穿越集会,这可能是签署的事情吗?

于 2012-08-14T17:47:29.463 回答
0

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

gacutil -i nameofassembly.dll

于 2012-12-31T10:39:47.807 回答
0

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

底线:我们需要在 LinqPad 中对此进行修复。我不知道有什么解决办法。

于 2012-08-30T19:26:41.030 回答