Sto usando LINQPad per testare il codice (che grande prodotto, devo dire) ma ora sto riscontrando un'eccezione quando provo a impostare Thread.CurrentPrincipal su un IPrincipal personalizzato che è marcato con il SerializableAttribute a seguito di un esempio che illustrano il problemalinqpad e personalizzato IPrincipal serializzabile
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");
}
}
}
Quando eseguo questo codice in LINQPad (C# programma come lingua) ottengo la seguente eccezione
Type is not resolved for member 'UserQuery+MyCustomPrincipal,query_nhxfev, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null'
RuntimeMethodInfo: PluginWindowManager.get_Form()
se mi tolgo la Serializable attributo tutto va bene Sembra un problema correlato all'architettura AppDomain utilizzata da LINQPad e all'incapacità del framework di trovare l'assembly che definisce MyCustomPrincipal. Inoltre, credo che la definizione di MyCustomPrincipal in un altro assembly e il suo inserimento nel GAC risolverebbe il problema, ma non è un'opzione per me. Qualcuno ha un'idea?
Grazie, Marco
EDIT: Non so se potrebbe aiutare, ma ho avuto lo stesso problema con SqlDependency.Start: mettere Serializable sul IPrincipal reso il quadro di gettare un errore lamentandosi del fatto che non riesce a trovare l'assembly che definisce il tipo di IPrincipal. Ho risolto con un trucco vergognoso:
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;
}
Questo sembra un problema LINQPad. Lo esaminerò in modo più dettagliato e postback. –
@JoeAlbahari hai qualche aggiornamento su questo? È davvero fastidioso e non ho trovato soluzioni alternative – mCasamento
Ho pensato di aver trovato una risposta qui: http://stackoverflow.com/questions/11489673/preventing-thread-currentprincipal-from-propagating-across-application-domains, ma non funziona con LINQPad perché le chiamate tra domini vengono avviate da entrambi i lati. Un sacco * di comunicazioni continua in LINQPad tra i domini host e worker - ci sono più di una dozzina di metodi - quindi non è solo una questione di hacking in una singola chiamata. –