【问题标题】:.NET Instrumentation - Call to Custom Assembly Fails - COR PROFILER.NET Instrumentation - 调用自定义程序集失败 - COR PROFILER
【发布时间】:2018-07-24 05:18:11
【问题描述】:

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

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

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

涂黑的是我所指的程序集名称 CAssemblyHelper.dll。该程序集没有任何依赖关系。我已经探测了 dll 在 web 配置文件中的位置。

 <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 模块时,会出现此异常和消息。

【问题讨论】:

    标签: .net azure azure-web-app-service .net-assembly .net-internals


    【解决方案1】:

    根据您的描述,我建议进行以下故障排除:

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

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

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

    CLR 如何加载一组程序集:

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

    此时,CLR知道了真正需要加载的程序集版本,并将其加载到GAC(可以理解为我们各自计算机中的共享文件夹)。如果执行最后一次重定向操作的配置文件中包含codeBase,则检查codeBase元素,从指定的URL加载CLR,否则会在应用程序的根目录下找到,在根目录下找不到,在配置文件probing指定的目录下找到。 CLR会先找DLL文件,CLR找不到DLL文件把后缀名改成exe再按规则搜索。

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

    更新:

    如果&lt;assemblyIdentity&gt; 对应强名称程序集,&lt;codeBase&gt; 只能指向应用程序基目录中的文件。此时,&lt;codeBase&gt; 将受到很大限制,与&lt;probing&gt; 元素非常相似。

    如果&lt;assemblyIdentity&gt;对应一个强命名程序集,那么&lt;codeBase&gt;可以指向任何URL(本地文件或网络地址都可以)。

    【讨论】:

    • 我已按照您的建议尝试使用 web.config 中的代码库。我收到错误消息,因为“此应用程序域已禁用 HTTP 程序集下载”。 - 在这里,我试图将 CAssemblyHelper dll 的调用注入“System.Core.dll”模块的函数中。即使我尝试给出 dll 文件的绝对路径也可以工作。
    • 现在我应该如何解决这个错误?即使使用代码库和探测元素,它也无法找到我的程序集。
    • 我收到“指定的用户没有有效的个人资料。”当我试图插入 System.Configuration.dll 而不是 System.Core.dll ..!请检查更新的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 2022-11-17
    • 2017-09-24
    相关资源
    最近更新 更多