在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. RabbitMQ介绍及安装部署

    本节内容: RabbitMQ介绍 RabbitMQ运行原理 RabbitMQ重要术语 三种ExchangeType RabbitMQ集群种类 集群基本概念 镜像模式部署集群 一.RabbitMQ介绍 ...

  2. 【HackerRank】How Many Substrings?

    https://www.hackerrank.com/challenges/how-many-substrings/problem 题解 似乎是被毒瘤澜澜放弃做T3的一道题(因为ASDFZ有很多人做过 ...

  3. windows7无声音,提示未插入扬声器或耳机的解决

    windows7无声音,提示未插入扬声器或耳机的解决: http://jingyan.baidu.com/article/358570f6043a85ce4624fc47.html

  4. 【原创】MHA对MySQL master Too many connections错误的处理机制

    有台服务器故障期间的现象: 1. 可以正常ping通 2. telnet服务端口报Too many connections错误 3. ssh连接不上 查看MHA的管理日志,在强制关机前的health ...

  5. <泛> 归并排序 及 逆序对

    今天写一个归并排序的模板,返回值为该序列的逆序对数 基本思路 归并排序就是利用二分的思想,将区间无限递归二分,直到当前划分区间只包含一个元素或没有元素的时候(我们认为这个序列是自动有序的),我们回溯到 ...

  6. Stream中reduce()使用记录

    一.reduce()使用1.第一个参数是我们给出的初值,2.第二个参数是累加器,可以自己用实现接口完成想要的操作,这里使用Bigdecimal的add方法 3.最后reduce会返回计算后的结果 Bi ...

  7. 容易错的try

    配对方式一:try{}catch{}配对方法二:try{}catch{}finally{}配对方法三:try{}finally{}所以可用看出 catch和finally都不是必须的,try和catc ...

  8. C#语法文本字面量

    C#语法文本字面量 在日常生活中,文本用来表示除了数字以外的内容.例如有一个叫“比尔”的人,他的职位为“科长”.那么,“比尔”和“科长”都可以称为文本.在计算机里,现实世界中的文本通常被称为字符和字符 ...

  9. 错误: No API token found for service account "default",

    [root@kubernetes-master pods]# kubectl create -f mysql.yaml Error from server (ServerTimeout): error ...

  10. 详解Python中的__init__和__new__(静态方法)

    一.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: #-*- co ...