cjoshit Ответов: 1

Сбой библиотеки DLL C/C++ после обновления .NET framework с 3.5 до 4.6


У меня есть приложение, называемое агентом, у которого есть 2 проекта :

1. Проект C#
2. DLL C/C++

Все приложение прекрасно работало с .NET 3.5, который мы используем для сборки с vs2008.

Из-за некоторых требований мы модернизировали его .Net Framework до 4.6 и против 2019 года, чтобы построить это.


Теперь моя служба приложений работает, но похоже, что экспорт dll C/C++ где-то терпит неудачу.

Что я уже пробовал:

TAgtLib.TAStartAgent(mServerPort, mName, mBinDir, mPath, mDebug,
                    mStdout, mDefaultLogDays, mEncryptOnly);


где TAgtLib-это класс-оболочка, который объявляет эти функции C/C++ следующим образом
[DllImport("ccplusplus.dll", CharSet = CharSet.Ansi)]
    public static extern int TAStartAgent(int port, string name, string bindir, string rundir, string debugOption, string stdoutOption, int mDefaultLogDays, int encryptonly);


Определение C++ :
extern "C" int _stdcall TAStartAgent(int PortNum, char *Name, char *binDir, char *runDir, char *debugOption, char *stdoutOption, int mDefaultLogDays, int encryptonly);


Всякий раз, когда отладка попадает на эту функцию из c#, она переходит в нарушение памяти.

Когда мы перешли в биндир.ToArray() и изменил объявление dllexport как char[] binDir ,simmilary для runDir,он не дал нарушения доступа, но он вошел внутрь dll.

Хотя C dll все еще дает проблемы.

Может ли кто-нибудь, пожалуйста, указать мне, что это должно влиять на dll c/c++ после этой миграции с 3.5 на 4.6?

Я относительно новичок в C#.

Спасибо

Richard Deeming

Какой тип строки ожидает ваш код C++? По умолчанию C# будет маршалировать строки как BStr, но я подозреваю, что вам нужен LPStr.
Маршалинг по умолчанию для строк | Microsoft Docs[^]

cjoshit

@Richard спасибо за ответ.
Я пробовал с LPStr , но он все еще не работает.

1 Ответов

Рейтинг:
1

RickZeeland

При установке / настройке VS2019 убедитесь, что Разработка настольных компьютеров на языке C++ рабочая нагрузка проверяется.
Смотрите пошаговое руководство ЗДЕСЬ: Пошаговое руководство: создание и использование собственной библиотеки динамических ссылок (C++) | Microsoft Docs[^]

Это также может быть необходимо для использования CallingConvention:
Атрибутом dllimportattribute.Поле CallingConvention (System.Runtime.InteropServices) | Майкрософт Документы[^]


cjoshit

Уже сделал это. Однако мой отладчик не переходит к dll для моих проектов.
Я создал тестовый проект c#, и dll для этого отладчика работает. Попробовал такую же настройку и на моем проекте, но это не так!!!

cjoshit

Тем не менее я чувствую его проблему со строками, которые передаются из C# в C++. похоже, что маршалинг по умолчанию работает для всех параметров, кроме этих двух пармов.