2012-07-13 28 views
6

Tôi đang sử dụng LINQPad để kiểm tra mã (một sản phẩm tuyệt vời, tôi phải nói) nhưng bây giờ tôi gặp phải một ngoại lệ khi tôi cố gắng đặt Thread.CurrentPrincipal thành một IPrincipal tùy chỉnh được đánh dấu với SerializableAttribute sau một mẫu mà chứng minh vấn đềlinqpad và tùy chỉnh IPrincipal serializable

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"); 
     } 
    } 
} 

Khi tôi chạy mã này trong LINQPad (C Chương trình # như Language) tôi nhận được ngoại lệ sau đây

Type is not resolved for member 'UserQuery+MyCustomPrincipal,query_nhxfev, Version=0.0.0.0, 
Culture=neutral, PublicKeyToken=null' 
RuntimeMethodInfo: PluginWindowManager.get_Form() 

Nếu tôi loại bỏ tất cả mọi thứ thuộc tính Serializable ổn. Có vẻ như một vấn đề liên quan đến kiến ​​trúc AppDomain mà LINQPad sử dụng và không có khả năng của khung công tác để tìm ra assembly mà xác định MyCustomPrincipal. Ngoài ra, tôi tin rằng việc định nghĩa MyCustomPrincipal vào một assembly khác và đưa nó vào GAC sẽ giải quyết vấn đề, nhưng đó không phải là một lựa chọn cho tôi. Bất cứ ai cũng có ý tưởng?

Cảm ơn, Marco

EDIT: Tôi không biết nếu nó có thể giúp đỡ, nhưng tôi đã có cùng một vấn đề với SqlDependency.Start: đặt Serializable trên IPrincipal khiến khuôn khổ để ném ra một lỗi phàn nàn rằng nó không thể tìm thấy hội đồng xác định loại IPrincipal. Tôi đã giải quyết với một hack đáng ngại:

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; 
} 
+5

này trông giống như một vấn đề LINQPad. Tôi sẽ xem xét chi tiết hơn và đăng lại. –

+0

@JoeAlbahari bạn có bất kỳ cập nhật nào về điều này không? Nó thực sự gây phiền nhiễu và tôi không tìm thấy bất kỳ workaround – mCasamento

+0

Tôi nghĩ rằng tôi đã tìm thấy một câu trả lời ở đây: http://stackoverflow.com/questions/11489673/preventing-thread-currentprincipal-from-propagating-across-application-domains, nhưng nó không hoạt động cho LINQPad vì các cuộc gọi tên miền chéo được bắt đầu từ cả hai phía. A * lot * các dấu phẩy đi vào trong LINQPad giữa các tên miền máy chủ và nhân viên - có hơn một tá phương pháp - do đó, nó không chỉ là một câu hỏi hacking xung quanh một cuộc gọi duy nhất. –

Trả lời

0

Một mẹo bạn có thể sử dụng là đặt tên mạnh cho hội đồng có chứa hiệu trưởng tùy chỉnh và đưa nó vào Bộ đệm ẩn toàn cục. Bằng cách đó, bất kỳ ứng dụng nào cũng có thể tìm thấy assembly mà bạn muốn, nó không phải là một giải pháp lý tưởng bởi vì bạn sẽ phải loại bỏ nó một lần nữa sau đó. Dù sao để cài đặt vào GAC nếu bạn có Visual Studio đã cài đặt chạy lên một command prompt VS và chạy như sau:

gacutil -i nameofassembly.dll

+0

Cảm ơn câu trả lời của bạn, tôi đã thử nó và nó hoạt động. Tôi xem xét nó nhiều hơn một cách giải quyết rằng một giải pháp thực sự, nhưng nó tốt hơn không có gì. Tuy nhiên, tôi đang gắn cờ đây là câu trả lời. – mCasamento

0

Đâm trong bóng tối nhưng nó có thể là một điều ký do hội đồng qua?

+0

có thể, nhưng làm cách nào tôi có thể ký một assembly chỉ tồn tại trong bộ nhớ? Nó nên được thực hiện bên trong LINQPad, phải không? – mCasamento

0

Điều này có vẻ là sự cố tuần tự hóa trong LinqPad. tôi thấy Joseph Albahari, tác giả của Linqpad, đã xác nhận điều này trong các bình luận của bạn.

Tóm lại: chúng tôi cần sửa chữa trong LinqPad cho việc này. Tôi không biết bất kỳ công việc nào xung quanh.