ASP.NET DllImport导致应用程序退出

Cor*_*lin 5 c# asp.net interop dllimport

我怀疑我的问题是由于一些安全问题,但这里是完整的描述,以防万一我弄错了.

我有一个最初用C(不是C++)编写的DLL.我正在使用DllImport来调用此库中的方法.声明看起来像这样:

[DllImport(@"MyAntiquatedLibrary.dll")
[SecurityPermission(SecurityAction.Assert, Unrestricted = true)]
internal static extern void GetConnectionString(string port, string server, string instance, [Out] StringBuilder output);
Run Code Online (Sandbox Code Playgroud)

头文件中的C声明如下所示:

void GetConnectionString(const char far *Portname, const char far *ServerName const char far *InstanceName, char far *retConnectionName);
Run Code Online (Sandbox Code Playgroud)

所以我在visual studio的WebApplication项目中创建了一个示例页面,其代码隐藏如下:

protected void Page_Load(object sender, EventArgs e)
{
  try
  {
    var connectionString = new StringBuilder();
    GetConnectionString(null, "myHost", "myInstance", connectionString);
    MyLabel.Text = connectionString.ToString();
  }
  catch(Exception ex)
  {
    MyLabel.Text = string.Format("Something went wrong: {0}", ex.Message);
  }
}
Run Code Online (Sandbox Code Playgroud)

当我调试程序并跳过GetConnectionString()方法调用时,我得到一个:

AccessViolationException was unhandled.
Attempted to read or write protected memory.  This is often an indication that other memory is corrupt.
Run Code Online (Sandbox Code Playgroud)

我在WebApplication项目中从Web服务或网页对interop DLL进行的任何调用都会出现同样的问题.在我测试这个时编写的ConsoleApplication中,相同的调用序列工作正常.

从WindowsConsole应用程序调用时,相同的代码工作正常.该示例从实际使用中略微简化,但结果是相同的.在真正的解决方案中,我有一个项目,负责管理与C-API的交互,这就是我的web服务所调用的,但我运行上面的示例并获得我已经解释过的行为.

Cor*_*lin 1

问题最终是我没有正确初始化 C-API。有一个函数调用可以初始化整个 API,当我在单元测试中执行此操作时,我忘记在 Web 服务中执行此操作。

不过,谢谢大家的帮助,我觉得我学到了很多关于 ASP.NET 安全模型和 .NET 信任实现的知识。