我正在玩预览版,并尝试向我的机器上本地部署的 IIS Web 应用程序添加见解。这是一个运行在普通应用程序池中的 .Net 4.5 应用程序。添加见解后启动应用程序时,我收到此异常:
无法加载文件或程序集“Microsoft.ApplicationInsights.Extensions.Intercept_x64.dll”或其依赖项之一。该模块应包含程序集清单。
我尝试将“启用 32 位应用程序”设置为真假,结果没有差异。
有没有人遇到过类似的错误?
我正在玩预览版,并尝试向我的机器上本地部署的 IIS Web 应用程序添加见解。这是一个运行在普通应用程序池中的 .Net 4.5 应用程序。添加见解后启动应用程序时,我收到此异常:
无法加载文件或程序集“Microsoft.ApplicationInsights.Extensions.Intercept_x64.dll”或其依赖项之一。该模块应包含程序集清单。
我尝试将“启用 32 位应用程序”设置为真假,结果没有差异。
有没有人遇到过类似的错误?
我仍在测试这个,但我想我已经解决了这个问题......
该解决方案基于与 SQL Spatial Types 原生 .dll 解决方案相同的解决方案;如果你知道这一点,你会看到这个包和那个包之间的相似之处。
Go 在 MVC 项目中创建一个新的子目录,并在这两个子目录下;我用了 :
MVCRoot ---> ApplicationInsights/x86
---> ApplicationInsights/x64
在每个目录下从包目录中添加一个链接项,这是:
../packages\Microsoft.Diagnostics.Instrumentation.Extensions.Intercept.0.12.0-build02810\lib\native\x64\Microsoft.ApplicationInsights.Extensions.Intercept_x64.dll
和
../packages\Microsoft.Diagnostics.Instrumentation.Extensions.Intercept.0.12.0-build02810\lib\native\x86\Microsoft.ApplicationInsights.Extensions.Intercept_x86.dll
分别。
然后,我将此代码添加到 AppplicationInsights 文件夹“根”中名为 loader.cs 的文件中,该文件如下所示:
using System;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
namespace ApplicationInsights
{
/// <summary>
/// Utility methods related to CLR Types for SQL Server
/// </summary>
internal class Utilities
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr LoadLibrary(string libname);
/// <summary>
/// Loads the required native assemblies for the current architecture (x86 or x64)
/// </summary>
/// <param name="rootApplicationPath">
/// Root path of the current application. Use Server.MapPath(".") for ASP.NET applications
/// and AppDomain.CurrentDomain.BaseDirectory for desktop applications.
/// </param>
public static void LoadNativeAssemblies(string rootApplicationPath)
{
var nativeBinaryPath = IntPtr.Size > 4
? Path.Combine(rootApplicationPath, @"ApplicationInsights\x64\")
: Path.Combine(rootApplicationPath, @"ApplicationInsights\x86\");
CheckAddDllPath(nativeBinaryPath);
// LoadNativeAssembly(nativeBinaryPath,
// IntPtr.Size > 4
// ? "Microsoft.ApplicationInsights.Extensions.Intercept_x64.dll"
// : "Microsoft.ApplicationInsights.Extensions.Intercept_x86.dll");
}
public static void CheckAddDllPath(string dllPath)
{
// find path to 'bin' folder
var pathsToAdd = Path.Combine(new string[] { AppDomain.CurrentDomain.BaseDirectory, dllPath });
// get current search path from environment
var path = Environment.GetEnvironmentVariable("PATH") ?? "";
// add 'bin' folder to search path if not already present
if (!path.Split(Path.PathSeparator).Contains(pathsToAdd, StringComparer.CurrentCultureIgnoreCase))
{
path = string.Join(Path.PathSeparator.ToString(), new string[] { path, pathsToAdd });
Environment.SetEnvironmentVariable("PATH", path);
}
}
private static void LoadNativeAssembly(string nativeBinaryPath, string assemblyName)
{
var path = Path.Combine(nativeBinaryPath, assemblyName);
var ptr = LoadLibrary(path);
if (ptr == IntPtr.Zero)
{
throw new Exception(string.Format(
"Error loading {0} (ErrorCode: {1})",
assemblyName,
Marshal.GetLastWin32Error()));
}
}
}
}
然后我将此添加到 global.asax 中,这样:
protected override void Application_Start(object sender, EventArgs e)
{
ApplicationInsights.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
}
到目前为止,据我所知,它似乎已经过去了。如果我发现我所做的事情有问题,所有人都会回来更新。
至少 MVC 应用程序现在启动了 :-)
更新:这不是故事的结局:-(
我还必须修改软件包 build 目录下的 Microsoft.Diagnostics.Instrumentation.Extensions.Intercept.props 文件,使其不包含文件到 bin 目录中。
当我完成后,它看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<None Include="$(MSBuildThisFileDirectory)\..\lib\native\x86\Microsoft.ApplicationInsights.Extensions.Intercept_x86.dll">
<CopyToOutputDirectory>None</CopyToOutputDirectory>
</None>
<None Include="$(MSBuildThisFileDirectory)\..\lib\native\x64\Microsoft.ApplicationInsights.Extensions.Intercept_x64.dll">
<CopyToOutputDirectory>None</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
我不得不将这个包签入到我的源代码控制系统中,因为我认为我现在将面临持续构建恢复我不想要的包的新副本的问题。
我等不及 MS 想出一个适当的解决方案。
我刚刚遇到这个问题,几个小时后发现它是由于与 FluentSecurity 冲突造成的。
这里有详细说明:https ://github.com/kristofferahl/FluentSecurity/issues/70
解决方法是在调用 SecurityConfigurator.Configure() 之前添加以下行:
SecurityDoctor.Current.EventListenerScannerSetup = scan =>
{
scan.ExcludeAssembly(file => Path.GetFileName(file).Equals("Microsoft.ApplicationInsights.Extensions.Intercept_x64.dll"));
scan.ExcludeAssembly(file => Path.GetFileName(file).Equals("Microsoft.ApplicationInsights.Extensions.Intercept_x86.dll"));
};
希望这对其他人有帮助。
不幸的是,ASP.NET 尝试将 \bin 中的所有内容作为托管程序集加载 Microsoft.ApplicationInsights.Extensions.Intercept_x64.dll不是托管程序集,但在这种情况下 ASP.NET Web App 不应该失败并显示黄页,你会只能在 FusLogvw 中看到。
你使用任何网络出版吗?您是否在发布时预编译了您的网站?
您能否提供异常的完整堆栈跟踪?
我的内心异常指向 WebActivator。所以我Uninstall-Package WebActivator -Force
,在 Application_Start 中添加了适当的调用,一切都很好。
我刚刚删除了我的 /bin 文件夹中的所有内容,它似乎已经解决了这个问题。不知道发生了什么或什么,这是一个我很久没有接触过的项目。但它解决了它:)