【问题标题】:IIS7 Installing/Configuring Native ModuleIIS7 安装/配置本机模块
【发布时间】:2019-01-10 12:14:07
【问题描述】:

我正在学习开发如何为 IIS 创建一个模块以供 Web 应用程序使用。当我将 .dll 添加到 IIS 中托管的 Web 应用程序的 /bin 文件夹时,它可以工作。

但如果我将此 .dll 添加到 根本地服务器 > 模块 > 配置本机模块注册。它不起作用,当我运行一个 Web 应用程序时,正在使用的 AppPool 已停止,我从事件查看器看到的日志是这样的:

在模块 DLL 中找不到 RegisterModule 入口点 %windir%\TestWebAgent\x86\TestModule.dll。 数据就是错误。

这是我扩展 IHttpModule 的类:

using System;
using System.Web;

namespace MyTestModule
{
    public class TestModule : IHttpModule
    {
        public void Dispose()
        {
            throw new NotImplementedException();
        }

        public void Init(HttpApplication application)
        {
            application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
        }

        private void Application_BeginRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;

            context.Response.Write("<h1><font color=green>AUTHENTICATED</font></h1><hr>");
        }
    }
}

【问题讨论】:

标签: c# iis iis-modules


【解决方案1】:

适用于遇到相同问题/问题的任何人。 Lex Li 的评论是真实的。

我写的类库是一个托管模块。在我访问的几乎所有指南/教程中都不清楚。所以这就是我为使它工作所做的工作:

  1. 将 .dll 注册到全局程序集缓存 (GAC)

    • 要将 .dll 注册到 GAC,必须对其进行签名。转到您项目的属性:Visual Studio > 解决方案资源管理器 > 右键单击​​您的项目并选择属性。
    • 转到“签名”选项卡,选中“签署程序集”。
    • 选择强名称密钥文件,选择新建
    • 输入您的密钥文件名
    • 取消勾选使用密码保护我的密钥文件,然后单击确定
    • 清理您的项目并重建
  2. 使用 gacutility 向 GAC 注册程序集(如果没有安装 gacutility.exe,可以下载 Windows SDK)

    • 要将程序集注册到 GAC,您可以使用 VS 开发人员命令提示符(以管理员权限运行)(如果您没有 VS 开发人员命令提示符,您可以使用具有管理员权限的 cmd 并将目录更改为 gacutility.exe 的位置)
    • 确认你的dll没有注册
    • gacutil /l MyModule.Test(假设您的 dll 名为 MyModule.Test.dll)
    • 要安装:gacutil /i C:/path_to_dll/MyModule.Test.dll
    • 获取公钥令牌:gacutil /l MyModule.Test(记下我们将在 web.config 中使用的公钥令牌)。
  3. 在 web 应用的 web.config 中添加模块:

    <system.webServer>
        <modules>
          <add name="MyModule" type="Namespace.ClassName, ProjectName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=999cf99ff999a99e, processorArchitecture=MSIL" preCondition="managedHandler,runtimeVersionv4.0" />
        </modules>
    </system.webServer>
    

【讨论】:

    【解决方案2】:

    对于遇到 NATIVE MODULES 错误且很可能在 x64 版本中编译的任何人

    在模块 DLL 中找不到 RegisterModule 入口点

    虽然在您的 VC++ 项目中简单地包含 *.def 文件似乎适用于 Win32 x86 编译的 DLL。将配置管理器切换到发布 x64 编译的 DLL 模块(并在 IIS 中删除 Web 配置 bitness32)时,您可能会遇到此错误。 您必须在项目属性下链接器的命令行选项中包含“/EXPORT:RegisterModule”。

    使用我的 Native Module x64 DLL,我在这条路上走了几个小时,试图弄清楚如何构建我的强命名 VC++ DLL;只是让 SN.EXE 一直告诉我我的 DLL

    不代表强命名程序集

    我得出的结论是 VC++ 编译的 x64 DLL 不能被强命名,这不是我的问题的解决方案。 有时错误消息实际上是问题所在,RegisterModule 没有被导出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多