在Windows Phone项目中调用C语言写的DLL

最近接到一个需求,需要在WP里调用一个C语言写的DLL,并且说Android和iOS都可以,问我WP是否可以这样? 我说我调研一下,就有了下面的文章。

在传统C# WinForm 里调用Win32 DLL都不容易(可能用惯了C#),要用P/Invoke,然后DllImport什么什么,那WP里不是更麻烦?

先看看网上有没有可用的文章,结果还真找到devdiv中的文章,但其中有两处错误,所以我fix bug并且整理一下,然后展示给大家。

1.1、建立"模拟"C语言生成DLL的工程

1.2、创建好project后, 就看到两个与之相同名称的文件

1.3、在.h文件里写入

#pragma once

extern "C" int _declspec(dllexport)Multiplication(int i, int j);

1.4、在.cpp文件里写入

#include "pch.h"
#include "CalculatorDynamicLinkLibrary.h" int Multiplication(int i, int j)
{
int calc = i * j; return calc;
}

1.5、编译这个project,在solution文件夹找到Debug,然后就能看到我们模拟生成的DLL

2.1、创建 C++ Windows Runtime Component 项目

2.2、创建好project后, 就看到两个与之相同名称的文件

2.3、在.h文件里写入

#pragma once
#include <collection.h>
#include <../CalculatorDynamicLinkLibrary/CalculatorDynamicLinkLibrary.h> namespace CalculatorInvoke
{
public ref class CalculatorInvoker sealed
{
public:
CalculatorInvoker(); int Mult(int i, int j);
};
}

2.4、在.cpp文件里写入

#include "pch.h"
#include "CalculatorInvoke.h" using namespace CalculatorInvoke;
using namespace Platform; CalculatorInvoker::CalculatorInvoker()
{
}
int CalculatorInvoker::Mult(int i, int j)
{
return Multiplication(i, j);
}

如果这时你着急编译,肯定会出错,不信就试试,呵呵!

2.5、在component project上,右键属性,找到设置Linker,在Additional Dependencies里填写第一个project的lib文件

devdiv网站是教的是设置.dll文件,我试了会报错

2.6、设置General,这里一定不能错,不然就会报找不到.lib文件。devdiv教的是指向绝对路径,如果把项目移到别的目录下还会报找不到.lib路径。

点Additional Library Directories 的下拉,再点Edit,就弹出如下窗口

Tips:关于类似”$(SolutionDir)“的用法,已经在链接3中给出了,列举比较详情,感谢作者!

3.1、创建 Windows Phone 项目,这里是大家最熟悉的部分了

 3.2、添加引用Windows Phone Component项目,或者后期引用Windows Phone Component生成出来的DLL也行。

3.3、添加Win32 DLL文件到Windows Phone项目中,并在属性里设置为conent, copy always。

3.4、添加WP里C#的代码

private void CalculateRsult(object sender, System.Windows.Input.GestureEventArgs e)
{
if (string.IsNullOrWhiteSpace(input1.Text) || string.IsNullOrWhiteSpace(input2.Text))
{
MessageBox.Show("输入框不能为空!", "友情提示", MessageBoxButton.OK);
return;
} CalculatorInvoker calculator = new CalculatorInvoker(); int i = Convert.ToInt32(this.input1.Text);
int j = Convert.ToInt32(this.input2.Text);
int result = calculator.Mult(i, j); this.txtResult.Text = string.Format("{0}", result);
}

编译步骤:先CalculatorDynamicLinkLibrary,再CalculatorInvoker,最后CalculatorApp

3.5、计算结果

源代码下载

参考文档:

http://www.devdiv.com/forum.php?mod=viewthread&tid=135252

http://www.jarredcapellman.com/2012/11/03/how-to-get-c-winrt-in-a-windows-phone-8-application/

http://www.cnblogs.com/lidabo/archive/2012/05/29/2524170.html

在Windows Phone项目中调用C语言DLL的更多相关文章

  1. Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决

    问题描述: mac笔记本本身会自带几个python版本,比如python2.7版本,我没有改动mac默认的python版本,只是安装了python3.7版本. 使用Pycharm开发Python项目没 ...

  2. (转)python中调用R语言通过rpy2 进行交互安装配置详解

    python中调用R语言通过rpy2 进行交互安装配置详解(R_USER.R_HOME配置) 2018年11月08日 10:00:11 luqin_ 阅读数:753   python中调用R语言通过r ...

  3. shell中调用R语言并传入参数的两种步骤

    shell中调用R语言并传入参数的两种方法 第一种: Rscript myscript.R R脚本的输出 第二种: R CMD BATCH myscript.R # Check the output ...

  4. 在Objc项目中调用Swift

    之前的文字中记录了在Swift项目中调用OC的相关代码,比较简单直接 传送门 但是在OC中调用swift代码则不是那么的和谐,网络上很多文章业已经有点陈旧.记录步骤如下: 1.创建OC项目 (1)启动 ...

  5. JNI_Android项目中调用.so动态库

    JNI_Android项目中调用.so动态库 2014年6月3日 JNI学习 參考:http://blog.sina.com.cn/s/blog_4298002e01013zk8.html 上一篇笔者 ...

  6. 在WEB项目中调用QQ通讯组件打开QQ聊天界面

    在很多WEB项目中,需要提供在线服务的功能,加上自己的联系方式,例如:QQ,不用添加QQ好友也可以交谈,那这到底是怎么实现的呢? 对于这个功能,需要提到一个组件,即“QQ通讯组件”.QQ通讯组件是一种 ...

  7. 一文教你快速学会在matlab的simulink中调用C语言进行仿真

    本文介绍如何在matlab的simulink中嵌入C语言进行多输入多输出的仿真:matlab版本位2015b: 创作不易,如果本文帮到了您: 如果本文帮到了您,请帮忙点个赞

  8. Windows API方式直接调用C#的DLL,支持多音字转拼音、Gzip解压缩、公式计算(VBA、C++、VB、Delphi甚至java都可以)

    原始链接 https://www.cnblogs.com/Charltsing/p/DllExport.html 这两年,我在VBA应用方面一直有几大痛点:1.多音字转拼音:2.64位下的GZIP解压 ...

  9. C#中调用c++的dll

    C#中调用c++的dll具体创建与调用步骤,亲测有效~   使用的工具是VS2010哦~其他工具暂时还没试过 我新建的工程名是my21dll,所以会生成2个同名文件.接下来需要改动的只有画横线的部分 ...

随机推荐

  1. MySQL学习笔记:删除存储过程和函数

    删除存储过程.存储函数主要使用drop语句: drop procedure  —— 删除存储过程 drop function  —— 删除存储函数 语法: DROP {PROCEDURE|FUNCTI ...

  2. innosetup语法详解

    ; 脚本由 Inno Setup 脚本向导 生成! ; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档! ;Inno Setup 是一个免费的 Windows 安装程序制作软件. ; ...

  3. ajax传递的参数服务器端接受不到的原因

    最常见的就是组织的json数据格式有问题,尝试把单引号改为双引号试试,如下: $datares = {"uname":$uname.val(),"phone": ...

  4. 【LOJ】#2497. 「PA 2017」Banany

    题解 一眼就是线段树维护点分树的dfs序嘛 代码debug一年(手动再见) 码力直线下降,坐等滚粗= = 很明显的我们需要一个点分树,然后求出以每个重心为根的树的dfs序,线段树维护一下每个点的价值- ...

  5. gym 100531 三维几何+搜索

    精度有点毒, 其实可以不用double, 因为A, B必定在其中一个在三角形上,可以投影到只有x,y轴的地方叉积比较. #include<bits/stdc++.h> #define LL ...

  6. Hadoop整理一(初识Hadoop)

    一.要点 1.Hadoop目的是让多台计算机同时解决一个问题 2.HDFS(Hadoop Distributed File System 分布式存储系统)是一个分布式文件系统,有目录,目录下可以存储文 ...

  7. 预备作业02:体会做中学(Learning By Doing)

    1.很惭愧,我并没有什么技能能强过大家. 2...... 3.我觉得培养一个技能,必须要通过勤勉的练习,认真的学习,还有不断地结合实践. 4.我觉得我学习<程序设计与数据结构>之后应该对程 ...

  8. 【小技巧】限制windows server 2008的最大用户登录数

    把云服务器单纯当作自己一个云端主机的人大有人在.本人就是其中一位. 由于windows server 2008的会话保持机制,导致你关闭掉当前远程桌面连接,并从另外一台电脑上开启远程连接之后,另外一台 ...

  9. dSploitzANTI渗透教程之修改MAC地址与Wifi监听器

    dSploitzANTI渗透教程之修改MAC地址与Wifi监听器 dSploitzANTI基本配置 渗透测试是一种安全性较大的工作.所以,在实施渗透测试之前进行一些简单设置.如修改MAC地址.了解网络 ...

  10. 机器学习之路: python nltk 文本特征提取

    git: https://github.com/linyi0604/MachineLearning 分别使用词袋法和nltk自然预言处理包提供的文本特征提取 from sklearn.feature_ ...