迁移至.NET 8后dotTrace激活C++/CLI类型失败求助
将企业应用从.NET Framework 4.8迁移至.NET 8后,使用dotTrace 2024.2.6进行性能分析时,激活C++/CLI类型会失败。搭建结构相似的最小复现示例后发现:保留ATL代码时dotTrace必现该错误,移除ATL代码则可正常运行,且ANTS性能分析器也出现相同问题。
项目结构与代码
1. Program.csproj 与 Program.cs
using System.Reflection; var legacyDeploymentServerHostInstance = Assembly.LoadFrom("CppCli.dll").GetType("CppCli.CppCliType"); var baseType = Activator.CreateInstance(legacyDeploymentServerHostInstance!) as Library.CppCli.BaseType; Console.WriteLine("Success");
2. Library.CppCli.csproj 与 BaseType.cs
namespace Library.CppCli { public interface BaseType : IDisposable { } }
3. CppCli.vcxproj 相关代码
CppCliType.h
namespace CppCli { public ref class CppCliType : public Library::CppCli::BaseType { public: CppCliType(); ~CppCliType(); }; }
CppCliType.cpp
#include "CppCliType.h" #include <atlstr.h> #include <iostream> namespace CppCli { CppCliType::CppCliType() { CString aCString = CString(_T("A string")); std::cout << (LPCTSTR)aCString; } CppCliType::~CppCliType() { System::Text::Json::JsonSerializer::Serialize(this); } }
错误信息
致命错误。内部CLR错误。(0x80131506)
在 System.StubHelpers.StubHelpers.ProfilerBeginTransitionCallback(IntPtr, IntPtr, System.Object)
在 .ATL.CSimpleStringT<wchar_t,0>.{ctor}(ATL.CSimpleStringT<wchar_t,0>, ATL.IAtlStringMgr)
在 .ATL.CStringT<wchar_t,ATL::StrTraitATL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>.{ctor}(ATL.CStringT<wchar_t,ATL::StrTraitATL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>, Char)
在 CppCli.CppCliType..ctor()
在 System.RuntimeType+ActivatorCache.CallConstructor(System.Object)
在 System.RuntimeType.CreateInstanceDefaultCtor(Boolean, Boolean)
在 System.Activator.CreateInstance(System.Type, Boolean, Boolean)
在 System.Activator.CreateInstance(System.Type, Boolean)
在 System.Activator.CreateInstance(System.Type)
在 Program.$(System.String[])
内容的提问来源于stack exchange,提问作者Yola

