.NET规范-调用自定义程序集失败-COR PROFILER

时间:2018-07-24 05:18:11

标签: .net azure azure-web-sites .net-assembly .net-internals

我正在尝试将.NET Instrumentation Profiler部署到Azure Web应用程序中。我正在使用COR_PROFILER_32和* _64和COR_PROFILING_ENABLED在Azure Web应用程序中启用我的探查器。

我的探查器将把代码插入所有模块,包括.NET Framework模块。 (例如System.dll,System.Core.dll等),甚至在用户模块中也是如此。检测到的代码将调用在单独的程序集“ CAssemblyHelper.dll”中定义的函数,该程序集是“ Any CPU”构建的。

这里的问题是,当我调用检测到的代码时,出现“ FileNotFoundException”错误消息。

enter image description here

涂黑的是我要引用的程序集名称CAssemblyHelper.dll。程序集没有任何依赖关系。我已经在网络配置文件中探查了dll的位置。

 <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="bin;PrivateFolder"/>
    </assemblyBinding>
  </runtime>

如何解决此错误..!我在IMetaDataAssemblyEmit中使用DefineAssemblyRef定义模块中的程序集。在普通的IIS服务器计算机中,CAssembly帮助程序将安装在GAC中,并且一切运行正常。在Azure中尝试时会出现问题。

更新1:

我尝试通过将代码库提供给Web配置文件..并仍然可以工作

    <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="bin;PrivateFolder"/>
      <dependentAssembly>
        <assemblyIdentity name="CAssemblyHelper"
                          publicKeyToken="XXXXXXX"
                          culture="neutral" />
        <codeBase version="1.0.0.0"
                  href="https://XXXX.scm.azurewebsites.net/api/vfs/SystemDrive/home/site/wwwroot/PrivateFolder/CAssemblyHelper.dll"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

其他错误:

异常:System.IO.FileLoadException

消息:指定的用户没有有效的个人资料。

当我尝试仅检测 System.Configuration.dll 模块时,会出现此异常和消息。

1 个答案:

答案 0 :(得分:0)

根据您的描述,我建议执行以下疑难解答:

使用KuDu检查CAssembly是否在正确的目录中,例如在bin下。关于如何使用KuDu,我们可以参考:Using KUDU with Microsoft Azure Web Apps

作为一种解决方法,我们可以将CAssembly.dll上载到Azure存储,然后可以使用codeBase节点指定此dll的URL。例如:

<codeBase version="2.0.0.0" href="https://xxxxx.blob.core.windows.net/mycontainer/CAssembly.dll?sp=r&st=2018-07-25T06:12:18Z&se=2018-07-25T14:12:18Z&spr=https&sv=2017-11-09&sig=FUBDgfV9pxxxxxxyHqnbvz0E9r%2BhSnA%3D&sr=b"/>

CLR如何加载一组程序集:

编译该方法时,CLR将确定其引用的类型和成员,然后在所引用的程序集中查找AssemblyRef元数据引用表,确定该程序集引用了哪个程序集,然后检查配置文件,并重定向指定的版本号。这是dependentAssembly,assemlyIdentity和bindingRedirect元素的操作。

这时,CLR知道真正需要加载的程序集的版本,并将其加载到GAC(您可以将其理解为我们各自计算机中的共享文件夹)。如果执行最后一个重定向操作的配置文件包含codeBase,则检查codeBase元素,从指定的URL加载CLR,否则它将在应用程序的根目录中找到,而在根目录中找不到,并且在配置文件探测指定的目录中找到。 CLR将首先查找DLL文件,而CLR找不到DLL文件以将后缀名更改为exe,然后根据规则进行搜索。

如果从配置文件中删除bindingRedirect元素,则应用程序将恢复。

更新

如果<assemblyIdentity> 对应于强名称程序集,则<codeBase>只能指向应用程序基本目录中的文件。此时,<codeBase>将非常受限制,并且与<probing>元素非常相似。

如果<assemblyIdentity>对应于一个全名程序集,则<codeBase>可以指向任何URL(可以是本地文件或网络地址)。