之前移植过DLNA的库,这个库是C++写的,然后我们的项目是C#的。接着很郁闷的事情发生了,主项目引用一个C#的DLL,然后这个DLL引用这个C++/CX封装的库。如果有C++的源代码的话,做项目依赖就很简单。如果是引用DLL的话,切换平台,这些DLL就要被覆盖一遍,而且经常会出现DLL加载失败的错误。
 
我最初的做法就是把这些DLL 都添加到主项目里面,在属性页中设置复制到输出目录。这种做法有个问题,就是这个DLL无法被添加到引用中。
 
后来,受到C++项目条件编译的启发,改写了一下C#的项目配置文件,在里面添加Choose节点。有个这个节点,就可以根据不同的平台,引用不同的DLL
 
 <Choose>
    <When Condition ="'$(Platform)' == 'ARM'">
      <ItemGroup>
        <Reference Include="PLTWinRt">
          <HintPath>>..\Win8\ReferenceDll\ARM\PLTWinRt.winmd</HintPath>
        </Reference>
      </ItemGroup>
    </When>
    <Otherwise>
      <ItemGroup>
        <Reference Include="PLTWinRt">
          <HintPath>..\Win8\ReferenceDll\X86\PLTWinRt.winmd</HintPath>
        </Reference>
      </ItemGroup>
    </Otherwise>
  </Choose>
 
对于主项目中添加的DLL,我采用预先生成事件命令行,把对应的DLL覆盖一下。
 
  <PropertyGroup Condition=" '$(Platform)' == 'x86'">
    <PreBuildEvent>Copy "$(ProjectDir)ReferenceDll\X86\*.*" "$(ProjectDir)"</PreBuildEvent>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Platform)' == 'ARM'">
    <PreBuildEvent>Copy "$(ProjectDir)ReferenceDll\ARM\*.*" "$(ProjectDir)"</PreBuildEvent>
  </PropertyGroup>
这样做法的好处就是可以让所有的DLL和EXE在同一个目录下面,如果采用前面的方式,那这些DLL会在子文件夹中。就可能出现加载不正常的问题。
 
如何诊断DLL加载是否正常,在Win8这里没有太好的工具去看,depends.exe看不了C#项目的引用,lldasm.exe会看到引用,但是不能确定是否正确加载,Fuslogvw.exe似乎看不到win8项目的DLL引用过程。
 
一个C++/CX的WinRt组件会有两个文件,一个PpboxRT.winmd和PpboxRT.dll。引用的时候,VS会输出加载winmd文件,如果对应.dll文件引用其他dll文件,其他的dll文件找不到了就会抛出FileNotFoundException 错误。
 
这个时候,我们要去项目的目录中去找对应的DLL有没有复制到指定目录里 Win8\bin\x86\Debug\AppX
 
另外,在这个目录里面还有AppxManifest.xml 文件,这个文件中记录着winmd文件和dll文件中的类的关联信息
    <Extension Category="windows.activatableClass.inProcessServer">
      <InProcessServer>
        <Path>PLTWinRt.dll</Path>
        <ActivatableClass ActivatableClassId="PLTWinRt.DMR_PositionInfo" ThreadingModel="both" />
        <ActivatableClass ActivatableClassId="PLTWinRt.DMR_ConnectionInfo" ThreadingModel="both" />
        <ActivatableClass ActivatableClassId="PLTWinRt.DMR_MediaInfo" ThreadingModel="both" />
        <ActivatableClass ActivatableClassId="PLTWinRt.MediaController" ThreadingModel="both" />
        <ActivatableClass ActivatableClassId="PLTWinRt.DMR_TransportSettings" ThreadingModel="both" />
        <ActivatableClass ActivatableClassId="PLTWinRt.DMR_TransportInfo" ThreadingModel="both" />
      </InProcessServer>
    </Extension>
当然这个节点也可以强行添加到Package.appxmaniest文件中。

Win8多平台引用配置的更多相关文章

  1. 美图WEB开放平台环境配置

    平台环境配置 1.1.设置crossdomain.xml 下载crossdomain.xml文件,把解压出来的crossdomain.xml文件放在您保存图片或图片来源的服务器根目录下,比如: htt ...

  2. 全新重装win8.1系统后 配置开发及办公环境步骤

    全新重装win8.1系统后 配置开发及办公环境步骤 这两天,系统因配置开发环境出错,重装了一下,为日后方便,故此记录系统配置流程,防日后重装系统计划不周. 安装前,对照步骤,准备好下列安装文件. 0. ...

  3. 第二步 在D2RQ平台上配置jena环境

    第二步 在D2RQ平台上配置jena环境 2013年10月16日 9:48:53 搞了这么长时间语义,只用过protege这样的工具,一直没有落实到实际代码上.jena也看过好久了,总认为是hp公司的 ...

  4. Win8.1系统下配置搭建IIS8.5+PHP5.5.4运行环境

    原文 Win8.1系统下配置搭建IIS8.5+PHP5.5.4运行环境 很多人喜欢用linux搭建php网页语言运行环境,但由于linux高度自定义化,经常需要root运行命令,略显高端,相对应的微软 ...

  5. 基于认证的代理平台搭建配置squid-20130730

    基于认证的代理平台搭建配置squid-20130730 功能:通过squid代理实现 (1)基于用户名密码认证的出口ip路由选择 (2)基于client源ip的出口ip路由选择 (3)基于连接本机ip ...

  6. Windows平台安装配置mysql数据库

    Windows平台安装配置mysql数据库 作者:Eric 微信:loveoracle11g 去下载mysql软件 https://www.mysql.com/downloads/ https://d ...

  7. Google Colab Notebook 的外部文件引用配置

    Google Colab Notebook 的外部文件引用配置 Reference: How to upload the file and read Google Colab 先装工具:google- ...

  8. Eclipse平台下配置Go语言开发环境(Win7)

    <Go语言编程>中写到:“从功能和易用性等方面考虑, Eclipse+GoEclipse.LiteIDE这两个环境在所有IDE里面是表现最好的”,所以笔者打算采用Eclipse+GoEcl ...

  9. 微信公众平台——基础配置——服务器配置:PHP版

    在自己的服务器上新建一个空白php文件,输入以下任一版本的代码,如下: 版本一: <?php $token = "dige1994"; $signature = $_GET[ ...

随机推荐

  1. [NC13A]反蝴蝶效应/[SPOJ-NPC2014D]General Joke

    [NC13A]反蝴蝶效应/[SPOJ-NPC2014D]General Joke 题目大意: 按顺序访问\(A_{1\sim n}(n\le10^5)\),经过\(A_i\)时身上必须有\(A_i\) ...

  2. windows远程连接Ubuntu12.04 (Ubuntu14.0连接方式不一样)

    参考 http://www.cnblogs.com/jerome-rong/archive/2012/08/16/2642035.html 有两种方式:Vnc方式(优缺点)和xrdp模式 中提到的Vn ...

  3. Ajax 跨域问题(JSONP && Access-Control-Allow-Origin)

    1.使用jsonp跨域请求 2.通过设置服务端头部跨域请求 3.设置nginx/apach 使用jsonp跨域请求 什么是Jsonp JSONP(JSON with Padding)是一个非官方的协议 ...

  4. Codeforces Beta Round #92 (Div. 1 Only) A. Prime Permutation 暴力

    A. Prime Permutation 题目连接: http://www.codeforces.com/contest/123/problem/A Description You are given ...

  5. Codeforces Round #262 (Div. 2) E. Roland and Rose 暴力

    E. Roland and Rose Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/pro ...

  6. PAT甲级1057. Stack

    PAT甲级1057. Stack 题意: 堆栈是最基础的数据结构之一,它基于"先进先出"(LIFO)的原理.基本操作包括Push(将元素插入顶部位置)和Pop(删除顶部元素).现在 ...

  7. [原]Redis使用场景及使用经验

    Redis is an open source (BSD licensed), in-memory data structure store! 欢迎转载,转载请注明出处 刚刚结束一个游戏类的活动项目, ...

  8. CentOS下使用KVM克隆虚拟机自动修改网卡的MAC地址

    克隆完虚拟机之后Mac地址还保留着母机的配置,此时需要修改成新的Mac地址才能继续,网上一般都是这样的手动操作: 参考:http://blog.51cto.com/freedyong/1361907 ...

  9. Windows系统默认调试器设置

    Windows系统默认调试器设置 1.使用运行打开drwtsn32 -i 注册华生医生到注册表如图: 2.使用运行打开drwtsn32可以进行一些常用的设置如图: 3. 注册表设置: HKEY_LOC ...

  10. Hough变换的方法检测直线段,效果良好

    转自pund, Hough_Grd 程序下载地址:点击下图,并在下图所示的路径下寻找