我们已经许可了一些第三方电子邮件组件,并为我们的系统开发了一组使用它们的组件。然后,这些组件在运行时由IoC容器动态加载。
然而,我们最近注意到在非开发机器上进行测试,因为“托管”我们组件的主要.EXE没有引用或包含第三方电子邮件组件的.licx(关注点分离)以及它导致第三方电子邮件组件的许可证检查失败。
到底有没有?
这似乎是.NET的整个LicenseManager,.licx等故事中的一个相当大的缺陷?
谢谢!
答案 0 :(得分:0)
许可证文件就像配置文件一样 - 您可以创建引用它们的库,但最终有一个工件必须与可执行文件一起存放在磁盘上。
我假设您有一个.licx文件,并且不想以任何方式从应用程序项目中引用它。您可以通过在安装程序中包含.licx文件来避免这种情况 - 它最终会在磁盘上的正确位置,并且应用程序项目不是更明智的。
答案 1 :(得分:0)
在对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");
要使这项工作正常,您还需要从MarshalByRefObject继承“MyClass”(以及在两个AppDomains之间传递的任何类)。