dll文件

VS2019 C++的跨平台开发——C# WPF

时间秒杀一切 提交于 2019-12-09 02:58:44
本篇介绍如何使用C++开发DLL给WPF的C#脚本调用。本文虽然以C#的WPF窗体应用为例子,但不限于此,.net平台都可以使用,包括Unity的C#脚本。 项目准备 首先VS2019相对于VS2017最明显的变化就是创建新建工程的界面,创建C++ DLL 工程和C# WPF如下图所示: C++项目的配置就参考之前的文章 https://blog.csdn.net/luoyu510183/article/details/83999548 ,下面就不详细说明了。C#的UI代码我也不说明,主要是讲C#调用C++ DLL的部分,其他部分可以下载我的工程看源码理解。 C++项目的提醒事项: C++的导出设置 先看看C++项目的文件结构: NativeInterface 先看下NativeIterface的代码,这个文件是把这个DLL下所有的导出接口都以一个类的形式进行导出。代码如下: ///////////////////////////////////////////// ////////////NativeInterface.h//////////////// ///////////////////////////////////////////// #pragma once extern "C" { //本类把本DLL下的所有接口都统一在这里,使用单例的方式创建指针给C#使用 /

C++调用WPF的dll

柔情痞子 提交于 2019-12-09 02:57:09
最近突发奇想希望能够在matlab里调用wpf做的界面(WPF做界面简单好看),所以希望能够利用wpf生成dll,然后在matlab调用这个dll来达到效果。于是先做了用c++调用的试试手。网上参考了这篇博文: http://blog.csdn.net/visual_studio1/article/details/53843447,但是里面有些细节没有说清楚,下面进行了详细的解说。 1 首先,新建一个wpf项目 2 删除App.xaml和MainWindow.xaml。 3 新建一个wpf窗口 4 把dll_sample输出类型改为类库 5 在Window1界面添加一个button,并添加代码 private void Button_Click(object sender, RoutedEventArgs e) { this.Close(); } 6 生成dll(忽略警告) 7 在solution下添加新的project 8 修改Project1的属性 添加引用 9 将之前生成的dll_sample.dll放入( \debug 这个文件内必须要有dll,还有一个随缘,我直接把他扔进C++内 ) 10 添加Source.cpp #include <iostream> #using "dll_sample.dll" using namespace std; using

WPF程序将DLL嵌入到EXE的两种方法

冷暖自知 提交于 2019-12-09 02:56:48
WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是《Visual Studio 版本转换工具WPF版开源了》的续,关于《Visual Studio 版本转换工具WPF版开源了》可以参看地下地址(两篇是一样的): 开源中国 http://my.oschina.net/chinesedragon/blog/308336 CNBLOGS http://www.cnblogs.com/luoshupeng/p/3946635.html ** 博客园的Markdown编辑器真的不行,还是麻烦大家稳步到 http://my.oschina.net/chinesedragon/blog/309223 观看吧 ** 引言 前几一写了一个小工具————《 Visual Studio版本转换工具 》,由于使用了WPF做为界面,因此这个小程序运行必须附带两个DLL:Microsoft.Expression.Interactions.dll和System.Windows.Interactivity.dll,同时由于自己也写了一个库,一个小程序需要附带3个DLL,这种体验真的很不爽,于是就着手把DLL嵌入到EXE中去。 挫折 对于C#程序,要把DLL嵌入到EXE中去,最权威和最常见的方法就是使用ILMerge这个工具,这是个命令行工具,有很多参数,可以将DLL很完美的嵌入到EXE中去

WPF生成dll,以及从dll中恢复exe

試著忘記壹切 提交于 2019-12-09 02:56:01
一,WPF生成dll 1. 将App.config和App.xaml这2个文件从项目中移除(不是彻底删除,否则无法恢复exe) 2. 在项目的属性中,Application中的Output type改为Class Library 3. rebuild即可 二,从dll恢复exe 1. 将App.config和App.xaml这2个文件加入项目中 2. 在项目的属性中,Application中的Output type改为Windows Application 3. 此时如果rebuild会产生 error: CS5001,找不到Main入口 4. 在App.xaml右键属性,把Build Action由Page改为ApplicationDefinition 5. rebuild即可 三,WPF Main位置 以及 自定义Main方法 1. 转自http://www.cnblogs.com/chenxizhang/archive/2010/03/25/1694611.html 来源: CSDN 作者: sp183207326 链接: https://blog.csdn.net/sp183207326/article/details/71159221

在 WPF 中,使用 C++ 编写的 DLL 文件

别等时光非礼了梦想. 提交于 2019-12-09 02:55:22
WPF运行在CLR上的,它的代码是托管代码。 C++编写的DLL代码是非托管的。 在WPF中调用C++编写的DLL代码需要使用: using System.Runtime.InteropServices; [DllImport("Dll.dll", EntryPoint = "add",CallingConvention=CallingConvention.Cdecl)] public static extern int add(int a, int b); 下面详细说明之。 编译生成DLL文件 在Visual Studio 2010中,File --> New --> Project --> Visual C++ --> Win32 --> Win32 Project 比如我们为工程起名为Dll,在弹出的对话框中,选择DLL,点击Finish即可。 在Dll.cpp中添加代码 #include "stdafx.h" int add(int a,int b) { returna+b; } 为了导出时不发生名字改编,我们添加一个模块定义文件Dll.def,方法是右击工程名àAddàNew Item,在弹出的对话框中,选择Module-Difinition File(.def),文件名为Dll.def。 在Dll.def中添加代码 LIBRARY Dll.dll EXPORTS add

WPF——打包dll到exe程序

坚强是说给别人听的谎言 提交于 2019-12-09 02:52:29
参考自: http://www.digitallycreated.net/Blog/61/combining-multiple-assemblies-into-a-single-exe-for-a-wpf-application https://stackoverflow.com/questions/1025843/merging-dlls-into-a-single-exe-with-wpf 在WPF中,将dll作为嵌入的资源打包到exe中的步骤: 注:该方法不能将非C#类型的dll(比如:C++编译的dll)打包到exe 第一步:添加以下代码段到WPF项目的.csproj文件中(需添加到节点“Import”的后面)。个人理解这段代码的作用:设置项目引用的dll为嵌入的资源(经测试,单独手动设置dll为嵌入的资源无效,必须添加这段代码到项目文件中,且需在节点“Import”的后面) < Target Name = "AfterResolveReferences" > < ItemGroup > < EmbeddedResource Include = "@(ReferenceCopyLocalPaths)" Condition = "'%(ReferenceCopyLocalPaths.Extension)' == '.dll'" > < LogicalName > %

How to Creat DLL(Dynamic link library)

落花浮王杯 提交于 2019-12-07 18:54:31
该文章属于在YouTube视频上看到的,链接如下: https://www.youtube.com/watch?v=EmDJsl7C9-k&t=3s 1.创建一个工程并建立一个控制台程序 2.Solution-->右键新建dll工程 3.Solution-->右键属性,选择依赖项,确定 4.CppClient-->右键设置属性$(SolutionDir)myLib\,inherit打勾,确定 5.VC++Directories-->Library Directories-->$(SolutionDir)$(IntDir) 6.myLib-->右键设置属性-->Command Line-->/DDLL_BUILD 7.myLib添加一个类,再添加一个头文件myLib.h 8.代码如下: 1 #pragma once 2 3 #ifndef EXT_MYLIB 4 5 #ifdef DLL_BUILD 6 #define EXT_MYLIB __declspec(dllexport) 7 #else 8 #pragma comment(lib, "myLib.lib") 9 #define EXT_MYLIB __declspec(dllimport) 10 #endif 11 12 #endif 13 14 15 extern int EXT_MYLIB max_size; 16

LIB和DLL的区别与使用,非常详细

ぐ巨炮叔叔 提交于 2019-12-07 17:33:08
共有两种库: 一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。 一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。 共有两种链接方式: 动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息。 静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。 关于lib和dll的区别如下: (1)lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。 (2)如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。使用静态编译的lib文件,在运行程序时不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才行。 (3)动态链接的情况下,有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据

Windows下hiredis分布式组件移植

北城余情 提交于 2019-12-07 12:13:52
1. 问题描述 分布式组件项目使用了Redis,在Windows平台使用QT+VS2010编译环境。但Redis客户端库hiredis在Windows平台只提供静态库,而且必须用VS2013以上的版本才能编译。由于VS2013要更新部分组件才能避免编译错误,最终以VS2015编译hiredis.lib静态库。这样就面临如下问题: VS2010不支持完整的C++11特性,linux能直接使用std::thread的代码在Windows无法编译。 但使用该组件的应用程序在Windows系统以VS2010编译,不能直接用VS2015编译出的hiredis.lib继续编译应用程序。 2. 解决过程 2.1. 跨系统移植 2.1.1.务必初始化所有变量 因为某个ID变量没有初始化,在linux运行正常,但移植到windows就出现错误。原因是该变量在linux被缺省初始化为0,单在Windows是随机值。 从代码的质量考虑,不能依赖系统的缺省值,必须养成初始化所有变量的习惯。 2.1.2.VS早期版本不支持C++11的全部标准 代码中使用了C++11的thread,在linux和Windows的VS2015运行正常,但在VS2010编译出错。原因是VS2012之前的版本不支持C++11标准。为此不得不大量使用条件编译,改用CreateThread等函数。 2.2.

idl文件,tlb文件 COM调用

泪湿孤枕 提交于 2019-12-07 10:27:33
1 使用i.h,i.c ,或者tlb文件 注册dll 然後調用 hrInit = ::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); if (SUCCEEDED(hrInit) || RPC_E_CHANGED_MODE == hrInit) { hr = ::CoCreateInstance( CLSID_MyComClass , NULL, CLSCTX_INPROC_SERVER, IID_IMyComClass , (void**)& pMyCOM); if (NULL != pMyCOM) { hr = pMyCOM->Add(2, 564); pMyCOM->Release(); pMyCOM = NULL; } if (SUCCEEDED(hrInit)) { ::CoUninitialize(); } 2 idl文件生成其他文件 MIDL D:\MyCOM.idl /tlb D:\MyCOM.tlb /h D:\MyCOM_i.h /iid D:\MyCOM_i.c /Oicf 3 跨语言 注册dll #import "..\..\comtest\comtest\Debug\comtest.tlb" named_guids ,no_namespace,raw_interfaces_only, raw_native