2

我正在尝试使用 linux centos7 中的 CoreCLR Profiler 来检测在 .NET Core 3.1 上运行的 .NET Core Web 应用程序。我已经设置了环境值 CORECLR_PROFILER 、 CORECLR_ENABLE_PROFILING 和 CORECLR_PROFILER_PATH ,其中我的 CoreCLRProfiler dll 附加到 dotnet.exe 并且它正在获取回调。

我能够获取所有回调,但是当我允许将代码注入 Web 应用程序的方法时,应用程序将崩溃(dotnet.exe 被杀死),因为它找不到注入的函数调用。

我用注入的函数体创建了辅助程序集(.NET 标准 2.0),并用强名称对其进行了签名,并将其安装到 GAC 中。并且还使用了来自 IMetaDataAssemblyEmit 的 DefineAssemblyRef()、DefineTypeRefByName() 和 DefineMemberRef() 来加载程序集及其类方法。并且还尝试将 dotnet 标准 dll 放在应用程序文件夹中。但是辅助程序集未加载到 dotnet.exe 进程。

我的助手程序集应该放在哪里..?和

如何从我的本机 coreclr 分析器将辅助程序集加载到 dotnet 进程?

如果我得到一些正确的方向来加载或使用辅助程序集来处理 dotnet 进程,那将非常有帮助。

提前致谢。

4

1 回答 1

1

我在加载托管 DLL 并从 Profiler 中调用它的过程中玩了很多:许多不同的方法,几乎​​所有方法都有某种限制。我们看到的问题是,如果调用外部 dll 的方法已经编译好了,现在加载外部 dll 就来不及了。即使方法被编译并且 dll 作为方法的一部分被加载(在调用 dll 之前),这对于 CLR 来说仍然为时已晚。你可以做的有点不完整,但它有效:检测对https://docs.microsoft.com/en-us/dotnet/api/system.appdomain.assemblyresolve的调用并添加您自己在特定位置查找的方法。这必须尽早完成(在编译调用此程序集的方法之前)。请注意,这将支持 .Net Framework 以及 .Net Core。如果只需要.Net Core的支持,可以使用这里描述的方式: https ://github.com/richlander/dotnet-core-assembly-loading

于 2020-02-11T13:39:02.970 回答