我是DLL的新手,我的任务是用几种语言编写一些DLL并在它们之间创建依赖关系。我设法创建了一个C#DLL并从C#应用程序导入它,以及创建一个C DLL并从C#应用程序导入它。但现在我又尝试了两件事:
我对第二个问题没有任何线索。我搜索过但我找不到我理解的东西。如果你能帮我一点,我会很高兴。
关于第一个问题;我写了一个C ++ DLL和一个C#应用程序,根据一些指南,我发现它应该可以工作,但它对我不起作用。 C ++ DLL文件:
#pragma once
namespace HelloCPPLibrary
{
class MyFunctions
{
public:
static __declspec(dllexport) char* HelloFromCPP();
};
}
#include "stdafx.h"
#include "HelloCPPLibrary.h"
using namespace std;
namespace HelloCPPLibrary
{
extern "C" {
char* HelloFromCPP() {
return "Hello from c++ dll";
}
}
}
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 :(得分: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;
}
}