【问题标题】:Licensed component not playing well with DI design许可组件不能很好地与 DI 设计配合使用
【发布时间】:2011-04-15 03:50:08
【问题描述】:

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

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

这里面还有吗?

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

谢谢!

【问题讨论】:

  • 你必须将它包含在你的项目中,没有其他办法。因为 Licx 文件实际上在同一个应用程序中创建了一个嵌入式资源。

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


【解决方案1】:

许可证文件就像配置文件一样 - 您可以创建引用它们的库,但最终有一个工件必须与可执行文件一起存在于磁盘上。

我假设您有一个 .licx 文件,只是不想从应用程序项目中以任何方式引用它。您可以通过在安装程序中包含 .licx 文件来避免这种情况 - 它最终会出现在磁盘上正确的位置,而应用程序项目并不明智。

【讨论】:

    【解决方案2】:

    进一步调查 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”(以及在两个 AppDomain 之间传递的任何类)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多