【发布时间】:2010-06-01 10:00:23
【问题描述】:
从 C# 网站调用 32 位 Delphi DLL 文件时遇到问题。代码一般运行良好,但偶尔会报错,
*无法加载 DLL '':找不到指定的模块。 (HRESULT 异常:0x8007007E)。
此问题一直存在,直到我为该站点回收应用程序池,然后它再次正常工作。
在同一台服务器上,还有一个 Web 服务正在调用同一组 DLL 文件。此 Web 服务似乎与该网站没有相同的问题。
两个应用程序都使用.NET Framework 3.5,IIS 上的单独应用程序池。
这是我用来包装 DLL 文件的代码:
public sealed class Mapper
{
static Mapper instance = null;
[DllImport("kernel32.dll")]
private static extern bool SetDllDirectory(string lpPathName);
private Mapper()
{
SetDllDirectory(ConfigManager.Path);
}
public static Mapper Instance
{
get
{
if (instance == null)
{
instance = new Mapper();
}
return instance;
}
}
public int Foo(string bar, ref double val)
{
return Loader.Foo(bar, ref val);
}
}
public static class Loader
{
[DllImport("some.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, EntryPoint = "foo")]
public static extern int Foo(string bar, ref double val);
}
那我这样称呼它:
double val = 0.0;
Mapper.Instance.Foo("bar", ref val);
为什么会“随机”无法加载 DLL '':找不到指定的模块。 (HRESULT 异常:0x8007007E)。?
另一个问题是我无法在开发环境中复制该问题。我认为由于两个应用程序调用相同的 DLL 文件,可能会发生一些锁定。为了复制这一点,我创建了一个应用程序,它产生多个线程并重复调用 32 位 DLL 文件,然后使用网站调用这些相同的 DLL 文件。我仍然无法复制该问题。
我能想到的一些可能的修复方法:
- 将 32 位 DLL 文件包装在 Web 服务中(因为 Web 服务似乎没有遇到同样的问题)。但是,如果事实证明 Web 服务也失败了,这可能毫无价值。
- 为会话状态设置状态服务器,并定期为站点回收应用程序池。这不是解决问题,只是避免它。
- 将 DLL 文件包装在一个 EXE 文件中,然后调用该 EXE 文件。然后我不应该遇到同样的问题。但这似乎也是一个 hacky 解决方案。
- 以不同的方式实现 mapper 类?但是我应该怎么打电话呢?另一个缺点是其他应用程序正在使用此映射器,所以我也需要更改那里的代码。
我该怎么办?
【问题讨论】:
-
请贴出异常的融合日志
-
嘿杰克,我明天看看能不能设置一下,如果出现错误,我会发帖的。谢谢
标签: c# winapi unmanaged dllimport