System.EntryNotFoundException: невозможно найти точку входа в DLL - PullRequest
2 голосов
/ 17 февраля 2012

Я готовлю небольшой C ++ dll, в котором функции должны вызываться из C #.

DLLTestFile.h

#ifdef DLLFUNCTIONEXPOSETEST_EXPORTS
#define DLLFUNCTIONEXPOSETEST_API __declspec(dllexport)
#else
#define DLLFUNCTIONEXPOSETEST_API __declspec(dllimport)
#endif

extern "C" DLLFUNCTIONEXPOSETEST_API int fnSumofTwoDigits(int a, int b);

DLLTestfile.cpp

#include "stdafx.h"
#include "DLLFunctionExposeTest.h"
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}
DLLFUNCTIONEXPOSETEST_API int fnSumofTwoDigits(int a, int b)
{
    return a + b;
}

C # проект:

static class TestImport
    {
        [DllImport("DLLFunctionExposeTest.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "fnSumofTwoDigits")]
        public static extern int fnSumofTwoDigits(int a, int b);
    }
public partial class MainWindow : Window
    {
        int e = 3, f = 4;
        public MainWindow()
        {
            try
            {
            InitializeComponent();
            int g = TestImport.fnSumofTwoDigits(e, f);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
}

Я получаю исключение: "System.EntryNotFoundException: невозможно найти точку входа в DLL"

Я использую шаблон по умолчанию, заданный Visual Studio, при создании нового проекта Visual C ++ -> Win32 Project -> DLL (проверены символы экспорта). Может кто-нибудь, пожалуйста, предложите решение для этого. Я не смог найти проблему даже после долгого поиска.

Ответы [ 3 ]

2 голосов
/ 17 февраля 2012

Работает нормально для меня, полные файлы для справки:

dllmain.cpp:

// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
#include "DLL.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}

DLL_API int fnSumofTwoDigits(int a, int b)
{
    return a + b;
}

DLL.h:

// The following ifdef block is the standard way of creating macros which make exporting 
// from a DLL simpler. All files within this DLL are compiled with the DLL_EXPORTS
// symbol defined on the command line. This symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see 
// DLL_API functions as being imported from a DLL, whereas this DLL sees symbols
// defined with this macro as being exported.
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif

extern "C" DLL_API int fnSumofTwoDigits(int a, int b);

Program.cs (Win32Консольное приложение для простоты):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplication2
{
    class Program
    {
        [DllImport("C:\\Users\\Kep\\Documents\\Visual Studio 2010\\Projects\\SODLL\\Debug\\DLL.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "fnSumofTwoDigits")]
        public static extern int fnSumofTwoDigits(int a, int b);

        static void Main(string[] args)
        {
            int A = fnSumofTwoDigits(3, 4);
            Console.WriteLine("A = " + A);
            Console.ReadLine();
        }
    }
}
1 голос
/ 17 февраля 2012

Возможно, ваш процесс C # работает как 64-битный, а ваша DLL - 32-битная или наоборот.Я видел эту проблему, когда битность процессов и DLL не совпадает.

0 голосов
/ 17 февраля 2012

Похоже, вы не определяете DLLFUNCTIONEXPOSETEST_EXPORTS, поэтому вы используете объявление импорта. Для проверки используйте dumpbin / exports, чтобы увидеть, какие функции экспортируются из dll.

Добавить

#define DLLFUNCTIONEXPOSETEST_EXPORTS 1 
#include DLLTestFile.h
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...