什么是ASPX脚本的ISAPI TerminateExtension相当于什么?

时间:2017-08-07 16:04:51

标签: c# asp.net iis dll isapi

我的用户通过C#ASPX脚本或VB ASPX脚本调用旧版第三方DLL,或通过ISAPI扩展DLL调用HTML表单。

旧版DLL有两个入口点:Compute()Close()。加载DLL后,Compute()可以被调用任意次,但在卸载DLL之前,必须调用Close()来释放各种资源。如果调用Close(),则必须先卸载并重新加载DLL,然后再次调用Compute()

为了最大限度地减少对各种资源的影响,IIS最好加载DLL一次,处理所有Compute()次调用,并仅在必要时卸载DLL。

ISAPI扩展知道何时加载DLL,因为IIS调用DllMain()GetExtensionVersion(),并且它知道何时将要卸载DLL,因为TerminateExtension()被调用,所以扩展完全按要求调用Close()

ISAPI表单很简单,因为扩展DLL完成了所有工作:

<html><head><title>Compute</title></head>
<body><h3>Compute</h3>
<form method="POST" action="CALLCOMPUTER.dll?find">
<p>
DLL input: <input size=30 name="inputField">
<p>
<input type="submit" value="Send to DLL">
</form></body></html>

C#ASPX表格(VB类似)是:

<% @Page Language="C#" %>
<% @Import Namespace="System.IO" %>
<% @Import Namespace="System.Runtime.InteropServices" %>

<script runat="server">
  public class DLLclass
  {
    [DllImport("COMPUTER.dll")]
    public static extern int Compute(string inputs, StringBuilder outputs);
  }

  private void SendToDLL(object sender, EventArgs e)
  {
    StringBuilder sb = new StringBuilder(1000); // mutable string buffer for result
    int i = DLLclass.Compute(inputField.Value, sb); // fill sb with result, ignore i
    DLLresult.InnerHtml = sb.ToString(); // display the result below our form
  }
</script>

<html><head><title>Compute</title></head>
<body><h3>Compute</h3>
<form runat="server">
<p>
DLL input: <input runat="server" type="TEXT" size=30 id="inputField">
<p>
<input runat="server" type="submit" value="Send to DLL" OnServerClick="SendToDLL">
<hr>
<span runat="server" id="DLLresult"/>
</form></body></html>

使用ASPX时,我将如何以及何时何地通知DLL即将卸载,以便我可以致电Close()

如果我在DLLclass.Close()之后放置DLLclass.Compute(),那么我还必须强制卸载DLL。我如何以IIS友好的方式执行此操作,以确保下次执行脚本时重新加载DLL?

在IIS决定加载或卸载DLL时,我是否必须以某种方式保持兼容的LoadLibrary() / FreeLibrary()调用?

0 个答案:

没有答案