Вызвать функцию Main .NET приложения из C++

Рейтинг: 1Ответов: 0Опубликовано: 16.07.2023

Я пишу программу лоадер на C++, которая запускает .NET программу из массива. Проблема заключается в том, что мне нужно запустить программу напрямую с Main функции, но лоадер выдает ошибку и говорит, что якобы не существует такой функции. Я где-то слышал, что можно использовать функцию Invoke_3, но я не понимаю как правильно ее вставить в мой код. Код лоадера на C++:


#pragma region Includes and Imports
#include <metahost.h>
#pragma comment(lib, "mscoree.lib")

// Import mscorlib.tlb (Microsoft Common Language Runtime Class Library).
#import <mscorlib.tlb> raw_interfaces_only          \
        high_property_prefixes("_get","_put","_putref")     \
        rename("ReportEvent", "InteropServices_ReportEvent")    \
    rename("or", "InteropServices_or")
using namespace mscorlib;
#pragma endregion


/*
$Bytes = Get-Content .\TestAssembly.dll -Encoding Byte
$Bytes.Length
$HexString = [System.Text.StringBuilder]::new($Bytes.Length * 4)
ForEach($byte in $Bytes) { $HexString.AppendFormat("\x{0:x2}", $byte) | Out-Null }
$HexString.ToString()
*/

unsigned char assemblyDLL[] = "\x4d\x5a\x90\x00\x03\x00\x00\x00\x04\x00\x00\x00\xff\xff\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x0e\x1f\xba\x0e\x00\xb4\x09\xcd\x21\xb8\x01\x4c\xcd\x21\x54\x68\x69\x73\x20\x70\x72\x6f\x67\x72\x61\x6d\x20\x63\x61\x6e\x6e\x6f\x74\x20\x62\x65\x20\x72\x75\x6e\x20\x69\x6e\x20\x44\x4f\x53\x20\x6d\x6f\x64\x65\x2e\x0d\x0d\x0a\x24\x00\x00\x00\x00\x00\x00\x00\x50\x45\x00\x00\x4c\x01\x03\x00\xe8\xe4\xb3\x64\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x02\x21\x0b\x01\x0b\x00\x00\x04\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x9e\x23\x00\x00\x00\x20\x00\x00\x00\x40\x00\x00\x00\x00\x00\x10\x00\x20\x00\x00\x00\x02\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x03\x00\x40\x85\x00\x00\x10\x00\x00\x10\x00\x00\x00\x00\x10\x00\x00\x10\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x23\x00\x00\x4b\x00\x00\x00\x00\x40\x00\x00\xb0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x20\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x74\x65\x78\x74\x00\x00\x00\xa4\x03\x00\x00\x00\x20\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x60\x2e\x72\x73\x72\x63\x00\x00\x00\xb0\x02\x00\x00\x00\x40\x00\x00\x00\x04\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x40\x2e\x72\x65\x6c\x6f\x63\x00\x00\x0c\x00\x00\x00\x00\x60\x00\x00\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x23\x00\x00\x00\x00\x00\x00\x48\x00\x00\x00\x02\x00\x05\x00\x74\x20\x00\x00\xdc\x02\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x30\x01\x00\x0e\x00\x00\x00\x01\x00\x00\x11\x00\x02\x28\x03\x00\x00\x0a\x26\x16\x0a\x2b\x00\x06\x2a\x1e\x02\x28\x04\x00\x00\x0a\x2a\x00\x00\x42\x53\x4a\x42\x01\x00\x01\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x76\x34\x2e\x30\x2e\x33\x30\x33\x31\x39\x00\x00\x00\x00\x05\x00\x6c\x00\x00\x00\x0c\x01\x00\x00\x23\x7e\x00\x00\x78\x01\x00\x00\x00\x01\x00\x00\x23\x53\x74\x72\x69\x6e\x67\x73\x00\x00\x00\x00\x78\x02\x00\x00\x08\x00\x00\x00\x23\x55\x53\x00\x80\x02\x00\x00\x10\x00\x00\x00\x23\x47\x55\x49\x44\x00\x00\x00\x90\x02\x00\x00\x4c\x00\x00\x00\x23\x42\x6c\x6f\x62\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x01\x47\x15\x02\x00\x09\x00\x00\x00\x00\xfa\x25\x33\x00\x16\x00\x00\x01\x00\x00\x00\x05\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x00\x00\x0a\x00\x01\x00\x00\x00\x00\x00\x06\x00\x41\x00\x3a\x00\x06\x00\x83\x00\x63\x00\x06\x00\xa3\x00\x63\x00\x0a\x00\xe1\x00\xcc\x00\x0a\x00\xec\x00\xcc\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00\x10\x00\x19\x00\x23\x00\x05\x00\x01\x00\x01\x00\x50\x20\x00\x00\x00\x00\x96\x00\x48\x00\x0a\x00\x01\x00\x6a\x20\x00\x00\x00\x00\x86\x18\x53\x00\x0f\x00\x02\x00\x00\x00\x01\x00\x59\x00\x11\x00\x53\x00\x13\x00\x19\x00\x53\x00\x0f\x00\x21\x00\xf9\x00\x18\x00\x09\x00\x53\x00\x0f\x00\x2e\x00\x0b\x00\x22\x00\x2e\x00\x13\x00\x2b\x00\x1e\x00\x04\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x31\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x4d\x6f\x64\x75\x6c\x65\x3e\x00\x48\x65\x6c\x6c\x6f\x57\x6f\x72\x6c\x64\x2e\x64\x6c\x6c\x00\x54\x65\x73\x74\x43\x6c\x61\x73\x73\x00\x54\x65\x73\x74\x4e\x61\x6d\x65\x73\x70\x61\x63\x65\x00\x6d\x73\x63\x6f\x72\x6c\x69\x62\x00\x53\x79\x73\x74\x65\x6d\x00\x4f\x62\x6a\x65\x63\x74\x00\x45\x6e\x74\x72\x79\x50\x6f\x69\x6e\x74\x00\x2e\x63\x74\x6f\x72\x00\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x00\x53\x79\x73\x74\x65\x6d\x2e\x52\x75\x6e\x74\x69\x6d\x65\x2e\x43\x6f\x6d\x70\x69\x6c\x65\x72\x53\x65\x72\x76\x69\x63\x65\x73\x00\x43\x6f\x6d\x70\x69\x6c\x61\x74\x69\x6f\x6e\x52\x65\x6c\x61\x78\x61\x74\x69\x6f\x6e\x73\x41\x74\x74\x72\x69\x62\x75\x74\x65\x00\x52\x75\x6e\x74\x69\x6d\x65\x43\x6f\x6d\x70\x61\x74\x69\x62\x69\x6c\x69\x74\x79\x41\x74\x74\x72\x69\x62\x75\x74\x65\x00\x48\x65\x6c\x6c\x6f\x57\x6f\x72\x6c\x64\x00\x53\x79\x73\x74\x65\x6d\x2e\x57\x69\x6e\x64\x6f\x77\x73\x2e\x46\x6f\x72\x6d\x73\x00\x4d\x65\x73\x73\x61\x67\x65\x42\x6f\x78\x00\x44\x69\x61\x6c\x6f\x67\x52\x65\x73\x75\x6c\x74\x00\x53\x68\x6f\x77\x00\x00\x00\x00\x03\x20\x00\x00\x00\x00\x00\xe2\x5b\x12\x58\x6f\x23\x33\x4b\xb1\xa1\xd2\xe7\xdf\x0b\xe2\xde\x00\x08\xb7\x7a\x5c\x56\x19\x34\xe0\x89\x04\x00\x01\x08\x0e\x03\x20\x00\x01\x04\x20\x01\x01\x08\x05\x00\x01\x11\x15\x0e\x03\x07\x01\x08\x08\x01\x00\x08\x00\x00\x00\x00\x00\x1e\x01\x00\x01\x00\x54\x02\x16\x57\x72\x61\x70\x4e\x6f\x6e\x45\x78\x63\x65\x70\x74\x69\x6f\x6e\x54\x68\x72\x6f\x77\x73\x01\x00\x00\x78\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x23\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x23\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x43\x6f\x72\x44\x6c\x6c\x4d\x61\x69\x6e\x00\x6d\x73\x63\x6f\x72\x65\x65\x2e\x64\x6c\x6c\x00\x00\x00\x00\x00\xff\x25\x00\x20\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x10\x00\x00\x00\x18\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x30\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x48\x00\x00\x00\x58\x40\x00\x00\x54\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x02\x34\x00\x00\x00\x56\x00\x53\x00\x5f\x00\x56\x00\x45\x00\x52\x00\x53\x00\x49\x00\x4f\x00\x4e\x00\x5f\x00\x49\x00\x4e\x00\x46\x00\x4f\x00\x00\x00\x00\x00\xbd\x04\xef\xfe\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x00\x00\x00\x01\x00\x56\x00\x61\x00\x72\x00\x46\x00\x69\x00\x6c\x00\x65\x00\x49\x00\x6e\x00\x66\x00\x6f\x00\x00\x00\x00\x00\x24\x00\x04\x00\x00\x00\x54\x00\x72\x00\x61\x00\x6e\x00\x73\x00\x6c\x00\x61\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x00\x00\x00\x00\x00\x00\xb0\x04\xb4\x01\x00\x00\x01\x00\x53\x00\x74\x00\x72\x00\x69\x00\x6e\x00\x67\x00\x46\x00\x69\x00\x6c\x00\x65\x00\x49\x00\x6e\x00\x66\x00\x6f\x00\x00\x00\x90\x01\x00\x00\x01\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x34\x00\x62\x00\x30\x00\x00\x00\x2c\x00\x02\x00\x01\x00\x46\x00\x69\x00\x6c\x00\x65\x00\x44\x00\x65\x00\x73\x00\x63\x00\x72\x00\x69\x00\x70\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x00\x00\x00\x00\x20\x00\x00\x00\x30\x00\x08\x00\x01\x00\x46\x00\x69\x00\x6c\x00\x65\x00\x56\x00\x65\x00\x72\x00\x73\x00\x69\x00\x6f\x00\x6e\x00\x00\x00\x00\x00\x30\x00\x2e\x00\x30\x00\x2e\x00\x30\x00\x2e\x00\x30\x00\x00\x00\x40\x00\x0f\x00\x01\x00\x49\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x6e\x00\x61\x00\x6c\x00\x4e\x00\x61\x00\x6d\x00\x65\x00\x00\x00\x48\x00\x65\x00\x6c\x00\x6c\x00\x6f\x00\x57\x00\x6f\x00\x72\x00\x6c\x00\x64\x00\x2e\x00\x64\x00\x6c\x00\x6c\x00\x00\x00\x00\x00\x28\x00\x02\x00\x01\x00\x4c\x00\x65\x00\x67\x00\x61\x00\x6c\x00\x43\x00\x6f\x00\x70\x00\x79\x00\x72\x00\x69\x00\x67\x00\x68\x00\x74\x00\x00\x00\x20\x00\x00\x00\x48\x00\x0f\x00\x01\x00\x4f\x00\x72\x00\x69\x00\x67\x00\x69\x00\x6e\x00\x61\x00\x6c\x00\x46\x00\x69\x00\x6c\x00\x65\x00\x6e\x00\x61\x00\x6d\x00\x65\x00\x00\x00\x48\x00\x65\x00\x6c\x00\x6c\x00\x6f\x00\x57\x00\x6f\x00\x72\x00\x6c\x00\x64\x00\x2e\x00\x64\x00\x6c\x00\x6c\x00\x00\x00\x00\x00\x34\x00\x08\x00\x01\x00\x50\x00\x72\x00\x6f\x00\x64\x00\x75\x00\x63\x00\x74\x00\x56\x00\x65\x00\x72\x00\x73\x00\x69\x00\x6f\x00\x6e\x00\x00\x00\x30\x00\x2e\x00\x30\x00\x2e\x00\x30\x00\x2e\x00\x30\x00\x00\x00\x38\x00\x08\x00\x01\x00\x41\x00\x73\x00\x73\x00\x65\x00\x6d\x00\x62\x00\x6c\x00\x79\x00\x20\x00\x56\x00\x65\x00\x72\x00\x73\x00\x69\x00\x6f\x00\x6e\x00\x00\x00\x30\x00\x2e\x00\x30\x00\x2e\x00\x30\x00\x2e\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x0c\x00\x00\x00\xa0\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
const unsigned int assemblyDLL_len = 3072;


int main()
{
    HRESULT hr;
    ICLRRuntimeInfo* pRuntimeInfo = NULL;
    ICorRuntimeHost* pCorRuntimeHost = NULL;

    // Load the CLR runtime
    ICLRMetaHost* pMetaHost = NULL;
    hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_PPV_ARGS(&pMetaHost));
    if (FAILED(hr)) {
        return -1;
    }
 
    hr = pMetaHost->GetRuntime(L"v4.0.30319", IID_PPV_ARGS(&pRuntimeInfo));
    if (FAILED(hr)) {
        return -1;
    }
    BOOL fLoadable;
    hr = pRuntimeInfo->IsLoadable(&fLoadable);
    if (FAILED(hr)) {
        return -1;
    }
    if (!fLoadable) {
        return -1;
    }
 
    hr = pRuntimeInfo->GetInterface(CLSID_CorRuntimeHost, IID_PPV_ARGS(&pCorRuntimeHost));
    if (FAILED(hr)) {
        return -1;
    }

    // Start the CLR
    hr = pCorRuntimeHost->Start();
    if (FAILED(hr)) {
        return -1;
    }

    // Get the default AppDomain for this Runtime host
    IUnknownPtr spAppDomainThunk = NULL;
    _AppDomainPtr spDefaultAppDomain = NULL;

    // Get a pointer to the default AppDomain in the CLR.
    hr = pCorRuntimeHost->GetDefaultDomain(&spAppDomainThunk);
    if (FAILED(hr)) {
        return -1;
    }

    hr = spAppDomainThunk->QueryInterface(IID_PPV_ARGS(&spDefaultAppDomain));
    if (FAILED(hr)) {
        return -1;
    }

    // Load the assembly from memory, declared as an unsigned char array
    SAFEARRAYBOUND bounds[1];
    bounds[0].cElements = assemblyDLL_len;
    bounds[0].lLbound = 0;

    SAFEARRAY* arr = SafeArrayCreate(VT_UI1, 1, bounds);
    SafeArrayLock(arr);
    memcpy(arr->pvData, assemblyDLL, assemblyDLL_len);
    SafeArrayUnlock(arr);

    _AssemblyPtr spAssembly = NULL;
    hr = spDefaultAppDomain->Load_3(arr, &spAssembly);
    if (FAILED(hr)) {
        return -1;
    }

    // Get the Type (ie: Namespace and Class type) to be instanciated from the assembly
    bstr_t bstrClassName("TestNamespace.TestClass");
    _TypePtr spType = NULL;

    hr = spAssembly->GetType_2(bstrClassName, &spType);
    if (FAILED(hr)) {
        return -1;
    }

    //----------------------------------------------------------------------
    // Finally, invoke the method passing it some arguments as a single string
    bstr_t bstrStaticMethodName(L"EntryPoint");
    SAFEARRAY* psaStaticMethodArgs = NULL;
    variant_t vtStringArg(L"Hello World. I am a .NET program, run with C++ loader");
    variant_t vtPSEntryPointReturnVal;
    variant_t vtEmpty;


    psaStaticMethodArgs = SafeArrayCreateVector(VT_VARIANT, 0, 1);
    LONG index = 0;

    hr = SafeArrayPutElement(psaStaticMethodArgs, &index, &vtStringArg);
    if (FAILED(hr)) {
        return -1;
    }

    // Invoke the method from the Type interface.
    hr = spType->InvokeMember_3(
        bstrStaticMethodName,
        static_cast<BindingFlags>(BindingFlags_InvokeMethod | BindingFlags_Static | BindingFlags_Public),
        NULL,
        vtEmpty,
        psaStaticMethodArgs,
        &vtPSEntryPointReturnVal);

    if (FAILED(hr)) {
        return -1;
    }

    SafeArrayDestroy(psaStaticMethodArgs);
    psaStaticMethodArgs = NULL;
}

А вот код программы, которую я запускаю:

using System.Windows.Forms;

namespace TestNamespace
{
    public class TestClass
    {
        public static int EntryPoint(string arguments)
        {
            MessageBox.Show(arguments);
            return 0;
        }
    }
}

Мне нужно каким-то образом вызвать программу из массива как EXE и именно с функции Main

Ответы

Ответов пока нет.