ArcGIS二次開發和ArcGIS桌面應用中,許可是一個老生常談的問題。以前也小結過一些經驗。參考:
http://www.cnblogs.com/liweis/p/4185311.html
問題描述
直接來先看報錯的代碼:
這是很普通的連接Sql Server SDE的代碼操作,
/// <summary> /// 獲取工作空間 public static IWorkspace GetWorkspace(IPropertySet pPropertySet) { if (pPropertySet == null) { return null; } // 創建 SDE 工作空間工廠,並打開工作空間 //Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.SdeWorkspaceFactory"); //var workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType); IWorkspaceFactory workspaceFactory = new SdeWorkspaceFactoryClass(); IWorkspace workspace = workspaceFactory.Open(pPropertySet, 0); return workspace; } /// <summary> /// 轉換成屬性設置 /// </summary> public static IPropertySet GePropertySet() { IPropertySet pPropertySet = new PropertySetClass(); pPropertySet.SetProperty("SERVER", "服務器IP"); pPropertySet.SetProperty("INSTANCE", string.Format("sde:SQLServer:{0}", "服務器IP")); pPropertySet.SetProperty("DATABASE", "數據庫名稱"); pPropertySet.SetProperty("USER", "sa"); pPropertySet.SetProperty("PASSWORD", "密碼"); //pPropertySet.SetProperty("VERSION", "SDE.DEFAULT"); pPropertySet.SetProperty("AUTHENTICATION_MODE", "DBMS"); return pPropertySet; }
經測試SDE連接參數正常,可在Open方法時,報錯"The Product License has not been initialized"(產品許可未初始化),程序是用代碼初始化許可的,運行綁定Desktop,產品許可類別是Advanced(高級版)
解決問題
在相同的環境下,另外一套程序又可以,比較兩者的不同,似乎與MapControl控件存在某種關聯,經反復測試,得出以下結果:使用AO的sample作對比,只要是先拖放MapControl控件,代碼就不會報許可問題(先拖放許可、或不拖MapControl都不行)。
暫時是解決了這個問題,我們姑且認為是10.4的bug,雖然沒有使用MapControl,但也拖放了這個控件(隱藏)。
我一直在想,既然它都能報這個錯,肯定不是什么bug,而不是我們不知道錯在哪里,經過一番測試,最終於不是通過許可方式解決它了。即在代碼初始化許可是除了添加Advanced許可,還添加了ArcServer許可。
參考文章