2013-07-26 58 views
0

我的問題與此post頗有關係,但我無法將所有零件組裝在一起。我想在插件代碼中使用ServiceContext對象,XrmServiceContext通過LINQ到取SystemUser,如下圖所示:ServiceContext(早綁定)檢索在CRM 2011插件中導致InvalidCastException

var serviceFactory = serviceProvider.GetOrganizationServiceFactory(); 
var service = serviceFactory.CreateOrganizationService(context.UserId); 
using (var xrmServiceContext = new XrmServiceContext(service)) 
{ 
    var user = xrmServiceContext.SystemUserSet 
        .Where(x => x.SystemUserId.Value == context.UserId) 
        .First(); 
} 

但我得到以下InvalidCastException

無法投類型的對象'Microsoft.Xrm.Sdk.Entity'鍵入'Xrm.SystemUser'。

儘管通過CrmSvcUtil生成的早期綁定類放置在單獨的程序集(插件程序集除外)中。

這很奇怪,就像我把生成的Early-bound類放在插件程序集裏面一樣正常。

我的一些研究促使我創建單獨的OrganizationServiceProxy的對象,但我爲什麼要創建一個在我使用serviceFactory.CreateOrganizationService(context.UserId)

因此,如何通過保持生成的代碼的插件集之外解決這個問題,已經創造IOrganizationService

回答

1

行爲並不奇怪。 如果將Early-Bound類放在另一個程序集中,這是非常正常的,即您的插件找不到它,特別是如果程序集不在服務器GAC中(例如)。

這是因爲當你註冊一個插件時,你只註冊插件DLL,而不是所有的引用程序集。

如果你想保持插件組件外部生成代碼,你有兩個選擇:

  1. 註冊(並保持更新)海關總署內部的早期綁定組件(如果你是預置,網上你不能做到這一點)
  2. 使用ILMerge兩個組件您註冊插件組裝

ILMerge鏈接之前結合:

http://www.microsoft.com/en-us/download/details.aspx?id=17630

+0

通過使用OrganizationServiceProxy,我可以通過將結果分配給Early-Bound類來執行相同的操作。但爲什麼我不能使用它?該插件可以被任何用戶調用,爲了創建「OrganizationServiceProxy」實例,我需要插件用戶憑證。目前我正在使用管理員憑證來啓動併成功執行相同的操作。 –

+0

如果您將早期綁定的類放入單獨的程序集中,並且您的插件找不到該程序集,則會發生異常。這與OrganizationServiceProxy或憑證無關。 –

1

添加另一個建議: 如果您在註冊插件時選擇了數據庫中的opion register插件,則還可以將早期綁定程序集放在C:\ Program Files \ Microsoft Dynamics CRM \ CRMWeb \ bin中。