Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/coreclr/vm/ceeload.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3744,10 +3744,19 @@ void SaveManagedCommandLine(LPCWSTR pwzAssemblyPath, int argc, LPCWSTR *argv)
#endif
}

static bool g_fIJWLoaded = false;

void Module::SetIsIJWFixedUp()
{
LIMITED_METHOD_CONTRACT;
InterlockedOr((LONG*)&m_dwTransientFlags, IS_IJW_FIXED_UP);
g_fIJWLoaded = true;
}

bool Module::HasAnyIJWBeenLoaded()
{
LIMITED_METHOD_CONTRACT;
return g_fIJWLoaded;
}
#endif // !DACCESS_COMPILE

Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/vm/ceeload.h
Original file line number Diff line number Diff line change
Expand Up @@ -1513,6 +1513,8 @@ class Module : public ModuleBase
BOOL IsIJWFixedUp() { return m_dwTransientFlags & IS_IJW_FIXED_UP; }
void SetIsIJWFixedUp();

static bool HasAnyIJWBeenLoaded();

BOOL IsBeingUnloaded() { return m_dwTransientFlags & IS_BEING_UNLOADED; }
void SetBeingUnloaded();
void StartUnload();
Expand Down
12 changes: 11 additions & 1 deletion src/coreclr/vm/ceemain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1702,7 +1702,17 @@ static void OsAttachThread(void* thread)

if (t_flsState == FLS_STATE_INVOKED)
{
_ASSERTE_ALL_BUILDS(!"Attempt to execute managed code after the .NET runtime thread state has been destroyed.");
// Managed C++ may run managed code in DllMain (e.g. during DLL_PROCESS_DETACH to run global destructors). This is
// not supported and unreliable. Historically, it happened to work most of the time. For backward compatibility,
// suppress this assert in release builds if we have encountered any mixed mode binaries.
if (Module::HasAnyIJWBeenLoaded())
{
_ASSERTE(!"Attempt to execute managed code after the .NET runtime thread state has been destroyed.");
}
else
{
_ASSERTE_ALL_BUILDS(!"Attempt to execute managed code after the .NET runtime thread state has been destroyed.");
}
}

t_flsState = FLS_STATE_ARMED;
Expand Down
Loading