Упаковка собственных DLL вместе с проектом C++/CLI .NET 8 для использования в проекте .NET 8 C#.C#

Место общения программистов C#
Ответить
Anonymous
 Упаковка собственных DLL вместе с проектом C++/CLI .NET 8 для использования в проекте .NET 8 C#.

Сообщение Anonymous »

У меня есть:

1. Собственная dll myNativeLib.dll, скомпилированная с помощью MSVC (созданная в рамках проекта .vcxproj)

2. Проект .NET8, ориентированный на CPP/CLI, который создает myInteropLib.dll (созданный с помощью проекта .vcxproj)
(Изменить: важно отметить, что myInteropLib не использует PInvoke для доступа к функциям в myNativeLib, вместо этого myInteropLib представляет собой CPP/CLI "управляемую библиотеку c++", которая напрямую связывается с myNativeLib и вызывает функции напрямую. Я унаследовал эту устаревшую базу кода и пытаюсь отправить ее внутри компании через nuget)
Я публикую библиотеки DLL вместе, используя файл nuspec:




0.0.1












В проекте в стиле SDK (.csproj) я использую этот пакет nuget:


И я вижу, что библиотеки DLL находятся там, где я ожидал.
myCSProject/bin/x64/Debug/net8.0-windows7/myInteropLib.dll
myCSProject/bin/x64/Debug/net8.0-windows7/runtimes/win-x64/native/Ijwhost.dll
myCSProject/bin/x64/Debug/net8.0-windows7/runtimes/win-x64/native/myNativeLib.dll

Однако при запуске myCSProject я получаю сообщение об ошибке, что myInteropLib не найден:
OneTimeSetUp: SetUp : System.IO.FileNotFoundException : Could not load file or assembly 'C:\path\to\myCSProject\bin\x64\Debug\net8.0-windows7\myInteropLib.dll'. The specified module could not be found.

Я знаю, что myInteropLib.dll существует, но открытие его с помощью «Зависимости» показывает, что он, в свою очередь, не может найти две собственные библиотеки:
Изображение

.deps.json для myCSProject (и myCSProject.test) показывает собственные зависимости с правильными путями:
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"MyCSProject.Test/1.0.0": {
"dependencies": {
"myCSProject": "1.0.0",
"Microsoft.NET.Test.Sdk": "18.0.1",
"NUnit": "4.5.0",
"NUnit.Analyzers": "4.11.2",
"NUnit3TestAdapter": "6.1.0",
"coverlet.collector": "6.0.4"
},
"runtime": {
"myCSProject.dll": {}
}
},
"coverlet.collector/6.0.4": {},
"myInterOpLib/0.0.1": {
"runtime": {
"lib/net8.0-windows7/myInterOpLib.dll": {
"assemblyVersion": "1.0.9523.27495",
"fileVersion": "10.5.0.0"
}
},
"runtimeTargets": {
"runtimes/win-x64/native/Ijwhost.dll": {
"rid": "win-x64",
"assetType": "native",
"fileVersion": "8.0.2325.60607"
},
"runtimes/win-x64/native/myNativeLib.dll": {
"rid": "win-x64",
"assetType": "native",
"fileVersion": "10.5.0.0"
}
}
},

Если я вручную копирую собственные библиотеки DLL и Ijwhost.dll в каталог myCSProject/bin/x64/Debug/net8.0-windows7/ - приложение загружается и работает нормально. Однако, если я изменю цель файла nuspec, чтобы собственные библиотеки DLL публиковались в каталоге lib вместо runtimes/win-x64/native, в нижестоящем проекте генерируется предупреждение, и эта документация указывает, что каталог runtimes/win-x64/native является правильным для собственных DLL в пакете nuget.
Что дает?
Изменить: 25.02.2026
В качестве обходного пути я теперь отправляю «родные» библиотеки DLL, нацелив «lib/net8.0-windows7» в файле nuspec. Это «работает», но теперь последующие проекты сообщают о предупреждении MSBuild для каждой включенной «родной» библиотеки DLL:
C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets(2433,5): warning MSB3246: Resolved file has a bad image, no metadata, or is otherwise inaccessible. Could not load file or assembly 'myNativeLib.dll' or one of its dependencies. The module was expected to contain an assembly manifest. Could not load file or assembly 'myNativeLib.dll' or one of its dependencies. The module was expected to contain an assembly manifest. [C:\Users\path\to\myCSharpProject.csproj]


Подробнее здесь: https://stackoverflow.com/questions/798 ... -in-net8-c
Ответить

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

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

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

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

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