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服务所调用的,但我运行上面的示例并获得我已经解释过的行为.
问题最终是我没有正确初始化 C-API。有一个函数调用可以初始化整个 API,当我在单元测试中执行此操作时,我忘记在 Web 服务中执行此操作。
不过,谢谢大家的帮助,我觉得我学到了很多关于 ASP.NET 安全模型和 .NET 信任实现的知识。
| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |