我們已經授權了一些第三方電子郵件組件,併爲我們的系統開發了一組使用它們的組件。然後這些組件在運行時由IoC容器動態加載。許可組件與DI設計不兼容
但是我們最近注意到在一個非開發機器上進行測試時,因爲主控我們組件的主要.EXE沒有引用或包含第三方電子郵件組件的.licx(分離擔心和所有)它導致第三方電子郵件組件的許可證檢查失敗。
反正有這個嗎?
這似乎是整個LicenseManager,.licx等.NET故事中的一個相當大的缺陷?
謝謝!
我們已經授權了一些第三方電子郵件組件,併爲我們的系統開發了一組使用它們的組件。然後這些組件在運行時由IoC容器動態加載。許可組件與DI設計不兼容
但是我們最近注意到在一個非開發機器上進行測試時,因爲主控我們組件的主要.EXE沒有引用或包含第三方電子郵件組件的.licx(分離擔心和所有)它導致第三方電子郵件組件的許可證檢查失敗。
反正有這個嗎?
這似乎是整個LicenseManager,.licx等.NET故事中的一個相當大的缺陷?
謝謝!
許可證文件就像配置文件 - 你可以創建引用它們的庫,但最終還是有一個工件必須與可執行文件一起存在磁盤上。
我假設你有一個.licx文件,但不想以任何方式從應用程序項目中引用它。您可以通過在安裝程序中包含.licx文件來避免這種情況 - 它會在正確的位置放在磁盤上,而且應用程序項目也不會更聰明。
經過對LicenseManager的進一步調查,似乎Validate方法僅掃描當前應用程序域的調用程序集(許可證信息存儲爲具有「.licenses」擴展名的嵌入式資源)。
一種解決方案是在單獨的應用程序域中運行代碼。這樣一來,第三方組件內的LicenseManager有隻掃描當前裝配的嵌入式資源,即
string assemblyPath = Assembly.GetExecutingAssembly().Location;
AppDomainSetup appSetup = new AppDomainSetup();
appSetup.ApplicationBase = new FileInfo(assemblyPath).DirectoryName;
var newDomain = AppDomain.CreateDomain("NewDomain", AppDomain.CurrentDomain.Evidence, appSetup);
var myClassInstance = (MyClass)newDomain.CreateInstanceFromAndUnwrap(assemblyPath, typeof(MyClass).FullName);
myClassInstance.myMethod("foo");
爲了使這項工作,你還需要繼承「MyClass的」(加上在二者之間傳遞的任何類AppDomains)從MarshalByRefObject。
你將不得不將它包含在你的項目中,沒有其他辦法。由於Licx文件實際上在同一應用程序中創建了嵌入式資源。 – 2012-01-19 05:39:55