ASP.NET MVC项目的本机DLL依赖项

时间:2017-03-11 20:11:42

标签: asp.net .net asp.net-mvc dll azure-web-sites

编辑:我找到了一种方法让它在本地工作,但在Azure上我仍然在该程序集上获得System.IO.FileNotFoundException。 我的问题似乎与this question here重复。但它略有不同,我已经尝试过这个解决方案但它没有用。以下是详细信息。

我有一个ASP.NET MVC应用程序,其Reference添加到第三方CLR DLL。该第三方DLL需要它调用的本机DLL。现在,如果我可以控制阴影复制发生的地方和复制的内容,我就会进入天堂。 Shadow Copying错过了复制该原生DLL,尽管它Build Action设置为ContentCopy To Output Dir设置为Copy Always

所以我搜索了互联网并遇到this discussion on SO,这与之前提到的相同。我尝试添加设置PATH Environment Variable Application_Init Application_Start Global.asax Delay Load的代码,我在这两种方法中设置了断点,令我惊讶的是我得到了ASP.NET错误页面甚至到达断点之前。这让我相信绑定时引用的程序集会命中本机DLL并调用它。我能做什么?我可以以某种方式延迟参考绑定吗? 编辑:是的,我打开了用Managed C ++编写的Referenced DLL代码,我将链接器设置调整为Application_Start Native DLL,现在我的Azure首先执行。 Yayy!但这并没有解决我在amzi.dll

上遇到的同样问题

Here is the test solution with DLLs

Here is the source code for the Native DLL

Here is the source code for the Referenced Assembly that uses the Native DLL

要下载本机DLL发行版Go to their distribution page,请选择具有所需位数的Windows归档文件(我使用的是32位),您将在API / bin目录中找到{{1}}。< / p>

2 个答案:

答案 0 :(得分:1)

实际问题是Azure服务器无法识别包装器DLL,因为缺少对早期框架和工具集的支持,以及Debug CRT。

  1. 我使用XDT / Application_Start设置PATH环境变量以包含我的本机DLL的位置

  2. 我将托管C ++包装器DLL升级为使用Toolset 14.0和.NET 4.6.2

  3. 在托管C ++包装器DLL上使用/ DELAYLOAD的链接器设置

答案 1 :(得分:0)

下载了您提供的DLL和源代码后,我发现本机DLL依赖于x64平台。首先,我们需要使用Azure门户将Web应用程序的Platform属性更改为x64。如果禁用平台按钮,则需要将Web应用程序计划扩展到基本级别计划或更高级别。

enter image description here

此外,原始路径可能以“;”结尾,因此我们需要检查它是否包含“;”并向其追加正确的内容。以下代码供您参考。

string path = Environment.GetEnvironmentVariable("PATH");

Trace.TraceError(path);
string binDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Bin");
Trace.TraceError(binDir);
if (path.EndsWith(";"))
{
    Environment.SetEnvironmentVariable("PATH", path + binDir);
}
else
{
    Environment.SetEnvironmentVariable("PATH", path + ";" + binDir);
}

要测试路径是否设置成功,您可以添加一个页面进行测试。

public ActionResult GetPath()
{
    string path = Environment.GetEnvironmentVariable("PATH");
    return Content(path);
}

设置路径后,可以在我这边成功加载本机DLL。

  

在我结束时,我在Application_Start的开头添加了一个新的ApplicationException(“Test”),而不是获取我的测试异常,我收到了DLL加载错误。

这意味着不会执行设置路径代码。要修复它,您可以从Web应用程序中删除本机DLL引用。现在您的应用程序可以正常工作并设置路径环境变量。然后,您可以添加本机DLL引用。

另一种方法是我们可以创建webjobs并在webjobs中设置路径环境变量,并在部署Web应用程序之前部署此webjobs。

  

我使用的是32位发行版,我的原生dll依赖于x86 / 32位。

如果您使用32位分发版并且CLR DLL和Web应用程序的平台目标设置为“x86或任何CPU”,则无需在Web应用程序中将平台更改为x64。请将其更改回x86。

enter image description here