Пробовала разные варианты создания на выходе файла DLL, который содержит несколько строк, поскольку изучаю C# - C++ непонятен совсем.
Покажите пожалуйста код для создания C++ DLL, которая будет содержать пару строк (string или int), чтобы при обращении к ней, к определенному методу - возвращало ту или иную строку.
Код:
File.h
#include
File.cpp
#include "Windows.h"
#include "WowSuite.h"
#include
using namespace std;
std::string String_One()
{
return "Hello, world!";
}
std::string String_Two()
{
return "Hello, world!";
}
Так возможно?
Ответ
file.h
#ifndef FILE_H
#define FILE_H
#if defined(MYLIBRARY)
#define LIBRARY_EXPORT __declspec(dllexport)
#else
#define LIBRARY_EXPORT
#endif
#include
std::string LIBRARY_EXPORT String_One();
std::string LIBRARY_EXPORT String_Two();
#endif // FILE_H
file.cpp
#include "file.h"
std::string String_One()
{
return "Hello, world!";
}
std::string String_Two()
{
return "Hello, world!";
}
При этом в проекте сборки dll, должен присутствовать DEFINE MYLIBRARY
Для Qt-creator для этого нужно в pro-файл добавить DEFINES += MYLIBRARY
В Visual Studio в настройках проекта С/С++ -> Preprocessor -> Preprocessor Definitions просто в конце добавить MYLIBRARY.
Стоит помнить, что библиотеки, в которых используются не только встроенные типы (char, int, float, double, bool, long), а и что-то другое(в том числе и std::string) требуют использования в основной программе(откуда загружается библиотека) использования того же компилятора, в случае с visual c++ еще и требуется соблюдения версии vc10, vc12, vc14 и пр. Так как разные компиляторы могут формировать разные имена экспортируемым функциям.
Если нужно использовать функции из других языков программирования, или с другим компилятором, или с помощью динамической загрузки библиотеки и использования GetProcAddress. То в h файле должны быть только объявления с использованием встроенных типов: (char, int, float, double, bool, long) и с добавлением extern "C", например:
#ifndef FILE_H
#define FILE_H
#if defined(MYLIBRARY)
#define LIBRARY_EXPORT __declspec(dllexport)
#else
#define LIBRARY_EXPORT
#endif
extern "C" int LIBRARY_EXPORT Val_One();
extern "C" int LIBRARY_EXPORT Val_Two();
#endif // FILE_H
file.cpp
#include "file.h"
int Val_One()
{
return 0;
}
int Val_Two()
{
return 1;
}
Для того чтоб использовать функции в проекте c#^
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
[DllImport("untitled.dll", EntryPoint = "Val_Two")]
public static extern int func1();
static void Main(string[] args)
{
Console.WriteLine(func1());
Console.ReadKey();
}
}
}
При этом не забыть подложить untitled.dll в папку с программой c#
Комментариев нет:
Отправить комментарий