【发布时间】:2015-02-15 23:21:29
【问题描述】:
情况如下: 我有用 Delphi 编写的“.dll”文件。它获取字符串参数并将其返回。如果我在“Windows”的“C#”应用程序中使用这个“.dll” - 它工作正常,但我需要在“asp.net Web 应用程序”中使用它,并且在 Web 应用程序中它会生成下一个异常:
iisexpress.exe has triggered a breakpoint.
Unhandled exception at 0x77A9E753 (ntdll.dll) in iisexpress.exe: 0xC0000374: A heap has been corrupted (parameters: 0x77AD4270).
“asp.net Web 应用程序”中的其他非托管“.dll”文件工作正常。所以我使用 ShareMem 和 borlandmm.dll 制作了简单的模拟“.dll”:
library Testas;
uses
ShareMem, SysUtils, Classes;
{$R *.res}
function DllTestas(var InputOutput: PAnsiChar): Longint; stdcall;
begin
Result := StrToIntDef(InputOutput, 0);
InputOutput := 'aaaa';
end;
exports
DllTestas;
begin
end.
还有简单的“asp.net web application”:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Runtime.InteropServices;
namespace WebApplication1
{
public partial class Default : System.Web.UI.Page
{
[DllImport("Testas.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern int DllTestas([MarshalAsAttribute(UnmanagedType.AnsiBStr)] ref string InputOutput);
protected void Page_Load(object sender, EventArgs e)
{
string InOut = "123";
int result = DllTestas(ref InOut);
Response.Write("Testas.dll:" + "<br />" + result.ToString() + " " + InOut + "<br />" + "<br />");
}
}
}
属性 - 选中“本机代码”,“平台目标”为“x86”。
所以这个模拟代码会产生相同的结果。
问题:错误在哪里以及如何解决?
建议将“.dll”重写为“C#” - 请不要提供。这是我的第一个想法,但是制作这个“.dll”的人会找到 1000 个不可能的理由,因为这是他的“面包”,而他并没有那么灵感来学习新语言。
模拟“.dll”是用“Delphi 2005”和“Delphi XE5”编译的——结果相同。 “asp.net 网络应用程序”-“VS 2013 Ultimate”。我有“.dll”的来源。
【问题讨论】:
-
也许 dll 仅在 STA 模型中运行良好。试试看:weblog.west-wind.com/posts/2012/Sep/18/…
-
[MarshalAs(UnmanagedType.AnsiBStr)] - 根据文档(docwiki.embarcadero.com/Libraries/XE6/en/System.PAnsiChar 和 msdn.microsoft.com/en-us/library/s9ts558h%28v=vs.110%29.aspx),必须有
[MarshalAs(UnmanagedType.LPStr)]。此外,我怀疑ref string应该替换为StringBuilder。 -
@Amit 谢谢,但所有这些都是针对“Windows 应用程序”的,而不是针对“Web 应用程序”的。在“windows 应用程序”中,“.dll”工作正常。对于真正的“Web 应用程序”,当出现异常时,我按“继续”“.dll”在“网页”上显示结果,但是当我将此代码放入 IIS 时,它不会显示异常,而是会制动服务器。
-
你的代码到处都是坏的。它似乎只适用于 Windows 应用程序。如果不更改 dll,您将无法修复它。越早明白,越早进步。
标签: c# asp.net .net delphi dll