Код: Выделить всё
#include "Launcher/Launcher.h"
#include
#include
int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow )
{
// Equivalent to [ System::STAThreadAttribute ] in managed code.
HRESULT lResult = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
if ( FAILED( lResult ) )
{
return -1;
}
Launch();
return 0;
}
Код: Выделить всё
#pragma once
#if defined( LAUNCHER_BUILD )
#define LAUNCHER_DLL __declspec(dllexport)
#else
#define LAUNCHER_DLL __declspec(dllimport)
#endif
LAUNCHER_DLL void Launch();
Код: Выделить всё
#include "Launcher.h"
#include
void LogTbbMalloc()
{
char** func_replacement_log;
int func_replacement_status = TBB_malloc_replacement_log( &func_replacement_log );
if ( func_replacement_status != 0 )
{
System::Diagnostics::Debug::WriteLine( "tbbmalloc replace failed!" );
}
System::Diagnostics::Debug::WriteLine( "tbbmalloc status:" );
for ( char** log_string = func_replacement_log; *log_string != 0; log_string++ )
{
System::Diagnostics::Debug::WriteLine( gcnew System::String( *log_string ) );
}
}
LAUNCHER_DLL void Launch()
{
LogTbbMalloc();
// Defined in a C# DLL, inherits from System.Windows.Application
LauncherCore::App^ lpApp = gcnew LauncherCore::App();
lpApp->InitializeComponent();
lpApp->Run();
}
< /code>
Использование этого подхода работает нормально для инициализации tbbmalloc_proxy. Мы получаем этот журнал: < /p>
tbbmalloc status:
Success: free (ucrtbase.dll), byte pattern:
Success: _msize (ucrtbase.dll), byte pattern:
Success: _aligned_free (ucrtbase.dll), byte pattern:
Success: _aligned_msize (ucrtbase.dll), byte pattern:
Success: _o_free (ucrtbase.dll), byte pattern:
Success: _free_base (ucrtbase.dll), byte pattern:
написано.
Код: Выделить всё
using System;
internal class Main
{
[STAThread]
internal static void Main()
{
Launcher.Launch();
}
}
Код: Выделить всё
#pragma once
public ref class Launcher
{
public:
static void Launch();
}
Код: Выделить всё
#include "Launcher.h"
#include
void LogTbbMalloc()
{
char** func_replacement_log;
int func_replacement_status = TBB_malloc_replacement_log( &func_replacement_log );
if ( func_replacement_status != 0 )
{
System::Diagnostics::Debug::WriteLine( "tbbmalloc replace failed!" );
}
System::Diagnostics::Debug::WriteLine( "tbbmalloc status:" );
for ( char** log_string = func_replacement_log; *log_string != 0; log_string++ )
{
System::Diagnostics::Debug::WriteLine( gcnew System::String( *log_string ) );
}
}
void Launcher::Launch()
{
LogTbbMalloc();
// Defined in a C# DLL, inherits from System.Windows.Application
LauncherCore::App^ lpApp = gcnew LauncherCore::App();
lpApp->InitializeComponent();
lpApp->Run();
}
tbbmalloc replace failed!
tbbmalloc status:
< /code>
Также стоит отметить, что при компиляции с .NET Framework 4.7.2 работает подход C ++ EXE и правильно устанавливается базовый каталог APP. Похоже на разницу во время выполнения между .NET Framework и .NET Core.
Так что я пытаюсь добиться, так это найти способ запустить мое смешанное приложение C ++/.net 9 при инициализации TBBMalloc_proxy для замены стандартных процедур распределения памяти C ++.>
Подробнее здесь: https://stackoverflow.com/questions/797 ... ve-a-valid
Мобильная версия