Как может обрабатывать смешанный .NET 9 инициализировать TBBMalloc_proxy и иметь действительный Appdomain.basedRectory?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как может обрабатывать смешанный .NET 9 инициализировать TBBMalloc_proxy и иметь действительный Appdomain.basedRectory?

Сообщение Anonymous »

В настоящее время мы переносим нашу смешанную кодовую базу из .NET Framework 4.7.2 на .NET 9. В 4.7.2 мы использовали C ++/CLI EXE для запуска приложения, так как это был удобный способ для нас инициализировать TBBMALLOC_PROXY, включив TBBMALLOC_PROXY.H в основной файл, а затем способный к CODE. Но C ++/Cli Exes больше не поддерживаются в .net 9. Таким образом, мы можем либо использовать нативный C ++ Exe или A C# Exe. /> main.cpp (c ++ exe) < /p>

Код: Выделить всё

#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;
}
launcher.h (c ++/cli dll)

Код: Выделить всё

#pragma once
#if defined( LAUNCHER_BUILD )
#define LAUNCHER_DLL __declspec(dllexport)
#else
#define LAUNCHER_DLL __declspec(dllimport)
#endif

LAUNCHER_DLL void Launch();
launcher.cpp (c ++/cli dll)

Код: Выделить всё

#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: 
Тем не менее, проблема в том, что System.appdomain.currentdomain.basedRectory пуста. Это проблематично, потому что это свойство используется внутри некоторых компонентов WPF, а именно: MediaElement , который пытается создать экземпляр URI с этим путем на System.windows.media.MediaPlayerState.openMedia (uri) , что приводит к моторозом с Invalid Message uri. /> Я затем попытался использовать вместо этого C# exe, вызывая C ++ /CLI DLL для инициализации tbbmalloc_proxy, а затем запустить основное C# app. < /p>
написано.

Код: Выделить всё

using System;

internal class Main
{
[STAThread]
internal static void Main()
{
Launcher.Launch();
}
}
launcher.h (c ++/cli dll)

Код: Выделить всё

#pragma once

public ref class Launcher
{
public:
static void Launch();
}
launcher.cpp (c ++/cli dll)

Код: Выделить всё

#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();
}
При использовании этого подхода, system.appdomain.currentdomain.basedirectory действительно устанавливается правильно, и мы не получаем ошибки с MediaElement . Тем не менее, tbbmalloc_proxy не инициализируется, что вредит производительности. Это журнал: < /p>
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»