无法找到名为' HelloFromCPP'的入口点。

时间:2016-06-02 18:19:28

标签: c# c++ dll

我是DLL的新手,我的任务是用几种语言编写一些DLL并在它们之间创建依赖关系。我设法创建了一个C#DLL并从C#应用程序导入它,以及创建一个C DLL并从C#应用程序导入它。但现在我又尝试了两件事:

  1. 编写C ++ DLL并从c#应用程序导入它。
  2. 导入我从C ++ DLL中编写的DLL。
  3. 我对第二个问题没有任何线索。我搜索过但我找不到我理解的东西。如果你能帮我一点,我会很高兴。

    关于第一个问题;我写了一个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#application

    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();
        }
    }
    

    }

    运行时,应用程序崩溃并返回标题中的错误。

2 个答案:

答案 0 :(得分:1)

首先确保实际导出该功能:

在Visual Studio命令提示符中,使用dumpbin / exports whatever.dll

比EntryPoint =“?HelloFromCPP @ MyFunctions @ HelloCPPLibrary @@ SAPADXZ”

答案 1 :(得分:0)

使用Visual Studio 2013进行测试。

构建DLL。您需要buttonSendFile_Click才能导出该功能。 这使得函数对DLL的调用者可见。 __declspec(dllexport)剥离了C ++名称 - 修改。 名称修改是C ++区分同名但不同参数的函数所必需的。 并在不同的类中区分同名的函数。

extern "C"

从C ++程序调用DLL

#include "stdafx.h"
using namespace std;

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

从C#调用DLL

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;
    }
}