2016-06-02 2 views
0

Я новичок в библиотеках DLL, и у меня есть задача написать некоторые библиотеки DLL на нескольких языках и создать зависимости между ними. Мне удалось создать DLL C# и импортировать его из приложения C#, а также создать C DLL и импортировать его из приложения C#. Но теперь я пробую еще 2 вещи:Невозможно найти точку входа с именем «HelloFromCPP»

  1. Запишите C++ DLL и импортируйте ее из приложения C#.
  2. Импорт DLL, который я написал из библиотеки C++.

У меня нет понятия о второй проблеме. Я искал, но я не мог найти то, что понял. Я был бы рад, если бы вы могли мне помочь.

О первой проблеме; Я написал C++ DLL и приложение C#, и в соответствии с некоторыми руководствами, которые я нашел, он должен работать, но он не работает для меня. C++ DLL файлы:

HelloCPPLibrary.h

#pragma once 

namespace HelloCPPLibrary 
{ 
     class MyFunctions 
     { 
     public: 
      static __declspec(dllexport) char* HelloFromCPP(); 
     }; 
} 

HELLODLL3.cpp

#include "stdafx.h" 
#include "HelloCPPLibrary.h" 

using namespace std; 

namespace HelloCPPLibrary 
{ 
    extern "C" { 
     char* HelloFromCPP() { 
      return "Hello from c++ dll"; 
     } 
    } 

} 

C# приложение

using System; 
using System.Runtime.InteropServices; 

namespace TestDll 
{ 

class Program 
{ 
    [DllImport(@"C:\Users\amitb\OneDrive\מסמכים\Visual Studio    2015\Projects\HELLODLL2\Debug\HELLODLL2")] 
    public static extern IntPtr HelloFromC(); 

    [DllImport(@"C:\Users\amitb\OneDrive\מסמכים\Visual Studio 2015\Projects\HELLODLL3\Debug\HELLODLL3", CallingConvention = CallingConvention.Cdecl)] 
    public static extern IntPtr HelloFromCPP(); 
    static void Main(string[] args) 
    { 
     Console.WriteLine(Marshal.PtrToStringAnsi(HelloFromC())); 
     Console.WriteLine(Marshal.PtrToStringAnsi(HelloFromCPP())); 

     Console.ReadKey(); 
    } 
} 

}

При запуске приложения происходит сбой и возвращает ошибку в заголовке.

ответ

0

Сначала убедитесь, что функция фактически вывезенная:

В строке Visual студии Command, используйте DUMPBIN/экспорт whatever.dll

чем EntryPoint =

"HelloFromCPP @ MyFunctions @ HelloCPPLibrary @@ SAPADXZ?"
+0

Может быть, это помогает найти решение, но это не решение само по себе. – user4581301

0

Протестировано с Visual Studio 2013.

Построение библиотеки DLL. Для экспорта функции вам понадобится __declspec(dllexport). Это делает функцию видимой для вызывающих DLL. extern "C" удаляет C++ имя-mangling. Для того, чтобы C++ различал функции одного и того же имени, а также различные параметры, требуется переписать имя. И различать функции одного и того же имени в разных классах.

#include "stdafx.h" 
using namespace std; 

namespace HelloCPPLibrary 
{ 
    extern "C" { 
     __declspec(dllexport) char* HelloFromCPP() { return "Hello from c++ dll"; } 
    } 
} 

Вызов DLL из C программы

typedef char * (*fun_ptr)(); // fun_ptr is a pointer to a function which returns char * and takes no arguments 

void main() { 
    HMODULE myDll = LoadLibrary("HelloCppLibrary.dll"); 
    if (myDll != NULL) { 
     auto fun = (fun_ptr)GetProcAddress(myDll, "HelloFromCPP"); 
     if (fun != NULL) 
      cout << fun() << endl; 
     else 
      cout << "Can't find HelloFromCpp" << endl; 
     FreeLibrary(myDll); 
    } 
    else { 
     cout << "Can't find HelloCppLibrary.dll" << endl; 
     cout << "GetLastError()=" << GetLastError() << endl; 
    } 
} 

++ Вызов DLL из C#

[DllImport("HelloCppLibrary.dll", CallingConvention = CallingConvention.Cdecl)] 
    public static extern IntPtr HelloFromCPP(); 

    public static void Main(string[] args) 
    { 
     Console.WriteLine(Marshal.PtrToStringAnsi(HelloFromCPP())); 
Смежные вопросы