Моя программа вызывает библиотеку 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, которая у меня нет исходного кода.
Я обновил код, как показано ниже :
Это работало. Так называемая неуправляемая dll из c# в порядке.
После того, как я поискал о cout, я нашел в stackoverflow некоторую тему, связанную с использованием cout в неуправляемой dll, вызванной из c# …
Поэтому после того, как я снова изменил функцию на следующую :
Ошибка повторяется !
Тогда я решил после некоторых советов в то время как triyng, чтобы решить эту проблему, чтобы построить DLL с Visual Studio C++ (вместо TDM-GCC-64).
После построения DLL С MS C++ и запуска теста под Win10: он работает 🙂
Std::cout в порядке
MessageBox в порядке
Больше нет: исключение из HRESULT: 0x8007045A
Большое спасибо людям, которые ответили.