【问题标题】:ASP.NET How to add assembly in web.config?ASP.NET 如何在 web.config 中添加程序集?
【发布时间】:2009-09-25 14:01:33
【问题描述】:

我在另一个项目 (projA) 中进行了组装。现在我想在另一个项目(projB)中导入这个 dll。我怎样才能做到这一点?这是我尝试过的(在 projB 中)。

1 将 dll 放在与我的项目相同的目录中。 (bin 目录)

2 在 web.config 中:

<assemblies>
  <add assembly="projA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</assemblies>

这是我得到的错误:

无法加载文件或程序集“projA,Version=1.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)

编辑:

关键是我最终必须动态添加程序集引用

编辑 2:

程序集(和命名空间)的名称存储在数据库中。在 projB 中添加(通过安装)物理程序集 (dll)。现在projB中的代码必须从数据库中读取程序集名称,然后添加对安装时添加的dll的引用。

【问题讨论】:

  • 您的编辑从根本上改变了我对这个问题的看法。

标签: asp.net assemblies web-config


【解决方案1】:

projA 的所有依赖项都在 projB 中吗?通常,如果它们在同一个解决方案中,我只会将一个项目的引用添加到另一个项目。

编辑:

如果您想动态添加程序集,那么可能需要考虑服务引用。通过将 projA 的 DLL 转储到并没有真正提供它可能需要的所有 DLL 的 bin 中,因此有办法将事物联系在一起,以便可以跨系统理解对象,例如使用 XML 的 Web 服务给出一个常见示例。

关于动态添加程序集的问题是,您从哪里获得它,该部分是否可以自动成为 projB 的一部分,因为这确实是此类问题的一般解决方案。

编辑 2:

如何获得 projA 的所有依赖项?是否有可能获得它,使其不依赖于可能在或可能不在要运行的系统上的一堆其他 DLL。这就是错误告诉您的内容,存在一些还需要的程序集 projC。请注意,如果使用了许多级别的依赖项,则此程序集的添加可能会持续很长时间。

总结答案:为了将 projA 加载到某个新项目中,您需要参考什么?这是你的问题,如果不知道依赖项是什么样子,很难直接回答。

【讨论】:

  • 关键是我最终必须动态添加程序集引用
  • 对不起,我已经编辑了我的帖子。希望这能让它更清楚
【解决方案2】:

如果程序集 DLL 位于 Bin 文件夹中,则无需在 Web.config 中添加任何内容 - 仅当您引用 GAC 中的程序集时才需要这样做。

您收到的错误消息基本上是说在 GAC 中找不到程序集,这可能是因为它不存在!

【讨论】:

  • 程序集加载器将首先查看本地 /bin 文件夹、/bin/ 和程序集名称、框架文件夹等的各种其他组合,然后再进入 GAC。
【解决方案3】:

您无需在 web.config 文件中手动添加引用。在 Visual Studio 的解决方案资源管理器窗口中右键单击您的项目,然后选择“添加引用”。转到浏览选项卡并找到您在其他项目中创建的 DLL,选择它并单击确定。或者,您可以将项目 A 添加到与项目 B 相同的解决方案中,然后通过“添加引用”窗口的“项目”选项卡添加引用。

【讨论】:

    【解决方案4】:

    错误

    找到的程序集的清单 定义与程序集不匹配 参考。

    表明找到了一个 DLL,但与版本或公钥不匹配。 我建议仔细检查以确保程序集引用与版本信息匹配,并且没有旧版本号的恶意 DLL 位于 /bin 路径或 GAC 中

    【讨论】:

      【解决方案5】:

      好吧,我想这在某种程度上取决于您在加载程序集后打算做什么,以及您在程序集中得到了什么。

      我假设你有某种插件架构,有一个已知的接口或基类,你将在上面调用方法,比如说 IPlugin。

      无论如何,以下是动态加载程序集的方法,基于在某个配置部分或数据库列中存储对它的引用:

      private IPlugin LoadPlugin(string fullTypeName) {
        Type type = Type.GetType(fullTypeName, false, true);
      
        Object plugin = Activator.CreateInstance(type);
      
        if (plugin is IPlugin) {
          return (IPlugin) plugin;
        }
      
        // Handle the fact you've not got what you expected however you like
        throw new ApplicationException(error);
      }
      

      因此,这将采用诸如"projA.PluginClass, projA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" 之类的字符串加载程序集,并返回您感兴趣的类的实例。

      然后你会像这样使用它:

      // Call to DB to get details of class and assembly
      string pluginClass = GetPluginDetails();
      
      IPlugin plugin = LoadPlugin(pluginClass);
      
      // Call known method to do something on IPlugin
      plugin.SomeMethod();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多