0

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

但是,如果我将此 .dll 添加到根本地服务器> Modules > Configure Native Modules and Register。它不起作用,当我运行 Web 应用程序时,正在使用的 AppPool 已停止,我从 eventviewer 看到的日志是这样的:

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

这是我扩展 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>");
        }
    }
}
4

2 回答 2

0

对于遇到相同问题/问题的任何人。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>
    
于 2018-08-08T12:48:40.920 回答
0

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

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

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

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

不代表强命名程序集

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

于 2019-07-11T19:25:41.983 回答