Ошибка C / C ++ DLL после обновления .NET Framework с 3.5 до 4.6 - PullRequest
1 голос
/ 07 ноября 2019

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

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

Все приложение работало нормально с.NET 3.5, который мы используем для сборки с vs2008. Из-за некоторых требований мы обновили .Net Framework до версии 4.6 и версии 2019, чтобы создать это. Теперь моя служба приложений работает, но похоже, что C / C ++ dll-экспорты где-то не работают. Что я пробовал: сторона 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 #, она переходит в нарушение памяти.

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

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

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

Я новичок в C #.

Спасибо

1 Ответ

0 голосов
/ 07 ноября 2019

Скорее всего, это происходит потому, что .Net 4 изменил способ исправления неправильных соглашений о вызовах P / Invoke.

С https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/ee941656(v=vs.100):

Для повышения производительности во взаимодействии с неуправляемымикод, неправильные соглашения о вызовах в вызове платформы теперь вызывают сбой приложения. В предыдущих версиях уровень маршалинга разрешал эти ошибки в стеке.

Чтобы решить эту проблему, вы должны указать правильное соглашение о вызовах в объявлении P / Invoke, например,

DllImport("ccplusplus.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int TAStartAgent(int port, string name, string bindir, string rundir, string debugOption, string stdoutOption, int mDefaultLogDays, int encryptonly);

Хотя вам, конечно, нужно будет указать правильное соглашение о вызовах для вашей DLL.

...