之前移植过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. 较有意思的Apple XSS(CVE-2016-7762)漏洞

    文章作者:Avfisher0x00 前言应CVE作者的要求帮忙分析一下这个漏洞,实际上这是一个思路比较有意思的Apple XSS(CVE-2016-7762).漏洞作者确实脑洞比较大也善于尝试和发掘, ...

  2. 【洛谷】P1063 能量项链【区间DP】

    P1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子, ...

  3. React-如何在jsx中自动补全标签(vscode)

    痛点:  React库最近的增长趋势很明显, 很多朋友都在选择学习, 很多公司也在选择使用React栈. 但在使用React库写代码的时候, 有一个很让人苦恼的问题, 就是标签在jsx语法中不能自动补 ...

  4. 典型案例收集-使用OpenVPN连通多个机房内网(iptables+静态路由)

    说明: 1.这个方案是我最初实现的方案,目的在于OpenVPN连通后使其能访问各自的子网,实现互通. 2.主要以iptables为主,这个是关键点,并且这种方式配置iptables十分复杂,最后加入了 ...

  5. Spring Bean InitializingBean和DisposableBean实例

    在Spring中,InitializingBean和DisposableBean是两个标记接口,为Spring执行时bean的初始化和销毁某些行为时的有用方法. 对于Bean实现 Initializi ...

  6. Caffe简单入门 AI

    https://yq.aliyun.com/articles/112207?spm=5176.100239.bloglist.58.wN003U

  7. redis+spring配置

    pom引入jedis的jar包 <dependency> <groupId>redis.clients</groupId> <artifactId>je ...

  8. PHP:面向对象学习笔记,重点模拟Mixin(掺入)

    背景 相对于Python.Node和Ruby来说PHP算是一门容易学习和使用的语言,因为这个特点也使其成为WEB开发领域的佼佼者,本文记录一下我对PHP面向对象部分的学习笔记. 先来一个复杂的例子:M ...

  9. Redis事务为什么不支持回滚

    在事务运行期间,虽然Redis命令可能会执行失败,但是Redis仍然会执行事务中余下的其他命令,而不会执行回滚操作,你可能会觉得这种行为很奇怪.然而,这种行为也有其合理之处:只有当被调用的Redis命 ...

  10. 第十五章 php时区报错 We selected the timezone 'UTC'

    Warning: phpinfo(): It is not safe to rely on the system's timezone settings. You are *required* to ...