Вызов C++ DLL из C# в порядке под Windows 7, но терпит неудачу под Windows 10

Моя программа вызывает библиотеку DLL C++ из моей программы c#.

Проблема заключается в том, что созданный исполняемый файл работает нормально undex Windows 7, но не под Windows 10 !?

Шаги перечислены ниже:

Я компилирую мою библиотеку DLL C++ с помощью g++ (TDM-GCC-64) в 64 битах.
Я компилирую свою программу C# с помощью Visual studio 15 и целевой .NET framework 4.5.2 в 64 битах.

Код DLL C++ :

главный.ч

#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>

/*  To use this exported function of dll, include this header in your project.  */

#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C"
{
#endif

void DLL_EXPORT SomeFunction(const LPCSTR sometext);

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

главный.СРР

#include "main.h"
#include <iostream>

// a sample exported function
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
    std::cout << "TEST FROM DLL : " << sometext << std::endl;
}

Команда build :
C:TDM-GCC-64bing++ — shared-o ..TestDllCallbinx64DebugmyDLL.dll-m64-g-D BUILD_DLL-L. main.СРР

Можно заметить, что dll создается непосредственно в целевом каталоге тестовой программы c# (отладка в 64 битах).

Основная программа C# :

Программа.цезий

using System;
using System.IO;
using System.Runtime.InteropServices;

namespace TestHstLibrary
{
    class MainProg
    {
        static void Main(string[] args)
        {
            ProgramTest ProgramTest = new ProgramTest();
            ProgramTest.dllCall();
            Console.ReadKey();
        }
    }

    class ProgramTest
    {
        [DllImport("myDLL.dll", EntryPoint = "SomeFunction")]
        static extern void SomeFunction(string sometext);

        public ProgramTest() {            
        }

        public void dllCall()
        {
            Console.WriteLine("dllCall ... ");            
            try
            {
                SomeFunction("Hello !");
            } catch (Exception e)
            {
                Console.WriteLine("EXCEPTION : " + e.Message);
                Console.WriteLine(e.ToString());
            }
            Console.WriteLine("");
        }        
    }
}

Примечание: сборка выполняется на конечной целевой plateform: Win10 64bits.

Запуск на моем Windows 10, у меня есть следующее :

dllCall …
Исключение: не удается загрузить DLL ‘ myDLL.dll»: не удалось выполнить процедуру инициализации динамической библиотеки (DLL). (Исключение из HRESULT: 0x8007045A)
Система.DllNotFoundException: не удается загрузить DLL ‘ myDLL.dll»: не удалось выполнить процедуру инициализации динамической библиотеки (DLL). (Исключение de HRESULT: 0x8007045A)
à ProgramTest.SomeFunction (String sometext)
à ProgramTest.dllCall () dans C:TestDllCallTestDllCallProgram.cs:ligne 30

После копирования всего каталога сборки из Win10 в Win7,
запуск его на моем Win7, у меня есть следующее :

dllCall …
Тест из DLL: Здравствуйте !

Это работает нормально.

Если у кого-то есть идея, почему он терпит неудачу под Win10, а не под Win7, я буду рад получить ответ.

Я проверяю с dependence walker и имел следующее:
— Под Windows 10 некоторые зависимости отсутствуют, даже если он был создан под Win10
— Под Windows 7 все зависимости в порядке.

Поэтому я пробую с другим компилятором C++ из G++ TDM-GCC-64, я тестировал с одним из cygwin : не дает лучшего результата, даже хуже.

Я также пытаюсь передать свой строковый параметр c# в качестве IntPtr, как показано ниже:

IntPtr myptr = Marshal.StringToHGlobalAnsi("Hello !");
SomeFunction(myptr);

Но он не работает ни под Win10, но все еще работает под Win7.

Другой тест должен был удалить std:: cout form my dll, наконец, вызов в порядке, но я все еще хочу, чтобы он работал, как это в тестовой среде и в рабочей среде мне придется сделать это с внешней dll, которая у меня нет исходного кода.

1 ответ

  1. Я обновил код, как показано ниже :

    int DLL_EXPORT SomeFunction()
    {
        return 5;
    }
    

    Это работало. Так называемая неуправляемая dll из c# в порядке.

    После того, как я поискал о cout, я нашел в stackoverflow некоторую тему, связанную с использованием cout в неуправляемой dll, вызванной из c# …

    Поэтому после того, как я снова изменил функцию на следующую :

    void DLL_EXPORT SomeFunction(const LPCSTR sometext)
    {
        MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
    }
    

    Ошибка повторяется !

    Тогда я решил после некоторых советов в то время как triyng, чтобы решить эту проблему, чтобы построить DLL с Visual Studio C++ (вместо TDM-GCC-64).

    После построения DLL С MS C++ и запуска теста под Win10: он работает 🙂

    Std::cout в порядке
    MessageBox в порядке
    Больше нет: исключение из HRESULT: 0x8007045A

    Большое спасибо людям, которые ответили.