许可组件与DI设计不兼容

时间:2010-09-21 11:27:45

标签: .net dependency-injection inversion-of-control

我们已经许可了一些第三方电子邮件组件,并为我们的系统开发了一组使用它们的组件。然后,这些组件在运行时由IoC容器动态加载。

然而,我们最近注意到在非开发机器上进行测试,因为“托管”我们组件的主要.EXE没有引用或包含第三方电子邮件组件的.licx(关注点分离)以及它导致第三方电子邮件组件的许可证检查失败。

到底有没有?

这似乎是.NET的整个LicenseManager,.licx等故事中的一个相当大的缺陷?

谢谢!

2 个答案:

答案 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之间传递的任何类)。