Архитектура, на которую я нацелен,:
Код: Выделить всё
Excel (VBA) → C++ native DLL → .NET Core 8 C# DLL< /code>
Идея состоит в том, что код VBA вызывает нативный DLL, и что DLL проводит временное выполнение .NET Core и направляет призыв к статическому методу [UnmanagedCallersonly] внутри моей сборки C#. < /p>
В моем реальном проекте VBA не является окончательной целью - я использую только Excel /vba здесь в качестве простой тестовой архитектуры для моей концепции. Последняя архитектура., С другой стороны, в BR /VBA, в качестве последней архитектуры. Однако, по сравнению с Final Architecture. Ограничения заставляют меня пройти через нативный DLL C ++ в качестве точки входа, который затем должен вызвать код C# .net Core. />https://drive.google.com/file/d/1he2nvuktjwj2rp-7orcvecpqimyaw9b0/view?usp=sharingобразно /> Подробная информация: < /h1>
c# code (cs_core.dll): < /h2>
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace MyNamespace;
public static class ManagedExports
{
[UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvStdcall) })]
public static int Add(int a, int b) => a + b;
}
< /code>
файл проекта: < /h3>
net8.0
true
enable
enable
< /code>
Таким образом, эта сборка построена против .net 8, не .net Framework. < /p>
C ++ Code (cpp_project.dll): < /h2>
extern "C" __declspec(dllexport) int __stdcall ManagedAdd(int a, int b)
{
// Path to runtimeconfig.json
fs::path runtimeconfig = L"C:\\POC\\cs_core.runtimeconfig.json";
if (!init_dotnet(runtimeconfig.c_str()))
return -1;
if (!get_managed_add_fn(L"C:\\POC\\cs_core.dll",
L"MyNamespace.ManagedExports, cs_core",
L"Add"))
return -2;
return g_add(a, b);
}
< /code>
vba code (Excel): < /h2>
Private Declare PtrSafe Function ManagedAdd Lib "C:\POC\cpp_project.dll" _
(ByVal a As Long, ByVal b As Long) As Long
Sub TestManagedAdd()
MsgBox "Result = " & ManagedAdd(2, 3)
End Sub
< /code>
Проблема < /h1>
При вызове из Excel DLL загружается и разгружается немедленно.
В выводе отладки Visual Studio я вижу: < /p>
'EXCEL.EXE' (Win32): Loaded 'C:\POC\cpp_project.dll'. Symbols loaded.
'EXCEL.EXE' (Win32): Unloaded 'C:\POC\cpp_project.dll'
< /code>
Но ожидаемый код C# никогда не работает, и нет Messagebox /Trace от dllmain. v4.0.30319, что сбивает с толку.'EXCEL.EXE' (Win32): Loaded 'C:\POC\cpp_project.dll'. Symbols loaded.
'EXCEL.EXE' (Win32): Unloaded 'C:\POC\cpp_project.dll'
CLR Header: 2.5
PE : PE32
ILONLY : 1
< /code>
ven, хотя он был скомпилирован с net8.0. < /p>
Что я попробовал < /p>
Использование Dotnet Exec CS_CORE.DLL → Не удается с пропущенным методиксацией: входная точка, которая имеет смысл, поскольку это не является exe. присутствует рядом с dll. < /p>
Пробое различные версии .NET SDK (8.0.414, 9.0.304). < /p>
Добавлено ведение журнала в dllmain с выходом woutendebugstring → никогда не запускается из Excel. net8.0 build.
Question
What is the correct way to wire Excel VBA → native C++ DLL → .NET Core 8 DLL ?
Environment
[*]Windows 10 (x64)
Excel 2016 (x64) < /li>
Visual Studio 2022 (17.14) < /li>
.net Sdk 8.0.414 и 9.0.304 Установлен < /li>
.net Runtime до 9.0.8. Мы застряли на этой стадии «DLL Loads/Enloads сразу».>
Подробнее здесь: https://stackoverflow.com/questions/797 ... ative-c-dl
Мобильная версия