Azure application insights 使用应用程序洞察状态监视器预览向应用程序添加洞察时运行应用程序时出现异常

Azure application insights 使用应用程序洞察状态监视器预览向应用程序添加洞察时运行应用程序时出现异常,azure-application-insights,Azure Application Insights,我正在玩预览,并尝试向本地部署在我机器上的IIS web应用程序添加洞察。它是一个.NET4.5应用程序,在普通应用程序池中运行。在添加洞察后启动应用程序时,出现以下异常: 无法加载文件或程序集“Microsoft.ApplicationInsights.Extensions.Intercept_x64.dll”或其依赖项之一。模块应包含程序集清单 我尝试将“启用32位应用程序”设置为true和false,结果没有任何差异 有人遇到过类似的错误吗?不幸的是,ASP.NET尝试将\bin中的所有内

我正在玩预览,并尝试向本地部署在我机器上的IIS web应用程序添加洞察。它是一个.NET4.5应用程序,在普通应用程序池中运行。在添加洞察后启动应用程序时,出现以下异常:

无法加载文件或程序集“Microsoft.ApplicationInsights.Extensions.Intercept_x64.dll”或其依赖项之一。模块应包含程序集清单

我尝试将“启用32位应用程序”设置为true和false,结果没有任何差异


有人遇到过类似的错误吗?

不幸的是,ASP.NET尝试将\bin中的所有内容作为托管程序集加载 Microsoft.ApplicationInsights.Extensions.Intercept_x64.dll不是托管程序集,但ASP.NET Web应用程序不应以黄色页面失败。在这种情况下,您只能在FusLogvw中看到它

你使用网络发布吗? 您是否在发布时预编译了网站


您能提供异常的完整堆栈跟踪吗?

我仍在测试,但我想我已经解决了这个问题

该解决方案基于与SQL Spatial Types native.dll解决方案相同的解决方案;如果你知道这一点,你会看到这个和那个包之间的相似之处

第一步 在MVC项目中创建一个新的子目录,并在另外两个子目录下创建;我用过:

MVCRoot ---> ApplicationInsights/x86
        ---> ApplicationInsights/x64
在每个目录下,从程序包目录添加一个链接项,如下所示:

../packages\Microsoft.Diagnostics.Instrumentation.Extensions.Intercept.0.12.0-build02810\lib\native\x64\Microsoft.ApplicationInsights.Extensions.Intercept\u x64.dll

../packages\Microsoft.Diagnostics.Instrumentation.Extensions.Intercept.0.12.0-build02810\lib\native\x86\Microsoft.ApplicationInsights.Extensions.Intercept\u x86.dll

分别

然后,我将此代码添加到AppApplicationInsights文件夹“root”中名为loader.cs的文件中,该文件如下所示:

使用系统;
使用System.IO;
使用System.Linq;
使用System.Runtime.InteropServices;
命名空间应用程序名称
{
/// 
///与SQL Server的CLR类型相关的实用程序方法
/// 
内部类实用程序
{
[DllImport(“kernel32.dll”,CharSet=CharSet.Auto,SetLastError=true)]
私有静态外部IntPtr加载库(字符串libname);
/// 
///加载当前体系结构(x86或x64)所需的本机程序集
/// 
/// 
///当前应用程序的根路径。对ASP.NET应用程序使用Server.MapPath(“.”)
///以及桌面应用程序的AppDomain.CurrentDomain.BaseDirectory。
/// 
公共静态void LoadNativeAssemblies(字符串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”);
}
公共静态void CheckAddDllPath(字符串dllPath)
{
//查找“bin”文件夹的路径
var pathsToAdd=Path.Combine(新字符串[]{AppDomain.CurrentDomain.BaseDirectory,dllPath});
//从环境中获取当前搜索路径
var path=Environment.GetEnvironmentVariable(“路径”);
//将“bin”文件夹添加到搜索路径(如果尚未存在)
如果(!path.Split(path.PathSeparator).Contains(pathsToAdd、StringComparer.CurrentCultureIgnoreCase))
{
path=string.Join(path.PathSeparator.ToString(),新字符串[]{path,pathsToAdd});
SetEnvironmentVariable(“路径”,路径);
}
}
私有静态void LoadNativeAssembly(字符串nativeBinaryPath,字符串assemblyName)
{
var path=path.Combine(nativeBinaryPath,assemblyName);
var ptr=加载库(路径);
如果(ptr==IntPtr.Zero)
{
抛出新异常(string.Format)(
“加载{0}时出错(错误代码:{1})”,
汇编名,
Marshal.GetLastWin32Error());
}
}
}
}
然后我将其添加到global.asax中,以便:

受保护覆盖无效应用程序\u启动(对象发送方,事件参数e)
{
ApplicationInsights.Utilities.LoadNativeAssemblies(Server.MapPath(“~/bin”);
}
据我所知,到目前为止,似乎已经发生了一些事件。如果我发现我所做的有问题,所有人都会回来更新

至少MVC应用程序现在启动:-)

更新:故事还没有结束:-(

我还必须修改包的build目录下的Microsoft.Diagnostics.Instrumentation.Extensions.Intercept.props文件,使其不包含bin目录中的文件

当我完成时,它看起来是这样的:


没有一个
没有一个
我必须将这个包签入我的源代码管理系统,因为我认为我现在将面临持续构建恢复一个我不想要的包的新副本的问题


我迫不及待地想让MS对此进行适当的修复。

我刚刚遇到这个问题,几个小时后发现它是由于与FluentSecurity冲突造成的

详情如下:

解决方法是添加以下行
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"));
};