我正在学习如何为IIS创建一个供web应用程序使用的模块。当我将.dll添加到IIS中托管的web应用程序的/bin文件夹时,它就可以工作了。
但是,如果我将此.dll添加到根本地服务器>模块Configure Native Modules并注册。它不起作用,当我运行一个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>");
}
}
}
适用于遇到相同问题的任何人。李的评论是真的。
我编写的类库是一个托管模块。这在我看过的几乎所有指南/教程中都不清楚
-
将.dll注册到全局程序集缓存(GAC(
- 若要将.dll注册到GAC,必须对其进行签名。转到项目的属性:Visual Studio>解决方案资源管理器>右键单击项目并选择属性
- 转到"签名"选项卡,选中"为程序集签名">
- 选择强名称密钥文件,选择"新建">
- 输入您的密钥文件名
- 取消选中"用密码保护我的密钥文件",然后单击"确定">
- 清理项目并重建
-
使用gactutility将程序集注册到GAC(如果您没有安装gactutility.exe,则可以下载Windows SDK(
- 要将程序集注册到GAC,可以使用VS Developer命令提示符(使用管理员权限运行((如果没有VS Developer命令提示,可以使用具有管理员权限的cmd并将目录更改为gacputility.exe的位置(
- 确认你的dll没有注册
- gautil/l MyModule。测试(假设您的dll名为MyModule.Test.dll(
- 要安装:gautil/i C:/path_To_dll/MyModule。测试.dll
- 获取公钥令牌:gautil/l MyModule。测试(注意公钥令牌,我们将在web.config中使用它(
-
在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>
对于任何在NATIVE MODULES中遇到此错误的人,并且很可能是在x64版中编译的
在模块DLL 中找不到RegisterModule入口点
虽然在VC++项目中简单地拥有*.def文件似乎适用于Win32 x86编译的DLL。将Configuration Manager切换到Release x64编译的DLL模块(并删除IIS中的web配置bitness32(时,您可能会遇到此错误您必须在项目属性下的链接器的命令行选项中包含"/EXPORT:RegisterModule">
使用我的本机模块x64 DLL,我沿着这条路走了几个小时,试图弄清楚如何构建我的强命名VC++DLL;结果SN.EXE一直告诉我我的DLL
不表示强命名程序集
我得出的结论是,VC++编译的x64 DLL不能被强命名,这不是我的问题的解决方案有时错误消息实际上就是问题所在,RegisterModule没有被导出