解决HRESULT: 0x80131515 的问题
最近工作中衣服自己洗有碰到一个调用dll的问题,错误代码是HRESULT: 0x80131515 。
后来发现是dll权限的问题,对于调用失败的dll,鼠标点击右键,属性。如果发现底部有“解除锁定”的复选框,勾选复选框,然后确定即可。
产生问题的原因是操作系统提高了安全性,二进制文件如果从网络上下载回来的话,就可能会有该标记,如果不解除直接调用的话,就会产生HRESULT: 0x80131515 错误。
最近工作中衣服自己洗有碰到一个调用dll的问题,错误代码是HRESULT: 0x80131515 。
后来发现是dll权限的问题,对于调用失败的dll,鼠标点击右键,属性。如果发现底部有“解除锁定”的复选框,勾选复选框,然后确定即可。
产生问题的原因是操作系统提高了安全性,二进制文件如果从网络上下载回来的话,就可能会有该标记,如果不解除直接调用的话,就会产生HRESULT: 0x80131515 错误。
自从苹果推出swift语言,已经过去好几个版本了,现在是时候考虑使用swift语言了。
在objective-c和swift相互调用的过程中,有一个很重要的文件,名称为<ProjectName>-Bridging-Header.h,假设我们的项目名称为 Laodaoxia,那么对应的文件名就是 Laodaoxia-Bridging-Header.h。这个文件第一次是由XCode自动生成的,这个文件负责完成2种不同的语言之间的转换。
现阶段,很多项目都是由objective-c创建的,当为他们添加新功能时,可以使用swift来编写。衣服自己洗先来说下如何添加swift支持。我们在项目中添加由swift文件,如果是第一次添加swift的话,IDE会提示你是否要创建桥接文件,点击是。此时,项目中会新增2个文件,一个是swift文件,一个是桥接文件。如果不小心删除了桥接文件,也可以手动创建一个,只要名称是符合上面的规定即可。
然后在swift文件中该怎么写代码就怎么写代码好了。对于 objective-c 文件,如果要调用swfit方法,则在对应的m文件里添加引用,#import “Laodaoxia-Swift.h”,剩下的就可以按照普通的 objective-c 的语法来调用swift 的方法了。<ProjectName>-Swift.h 文件应该是一个隐藏的文件,XCode负责把项目中的swift文件类通过该文件来提供给objective-c文件调用。
至于swift项目,要添加objective-c代码,例如很多通用库等等,也是差不多的步骤。项目中添加objective-c的类,第一次添加时,IDE会询问是否要添加桥接文件,同意添加后,项目中会新增对应的h文件,m文件和桥接文件。把swift会用到的objective-c类的头文件,全部使用#import假如到桥接文件里。
添加完成后,即可在swift代码里使用swift语法格式来使用objective-c提供的方法了。
前不久昊问起来如何让c++和c#相互调用dll,后来专门去搜索了下,现在衣服自己洗分享出来,可能对大家有帮助。
首先我们来说c#调用c++编译的dll。这个网上已经很多了,c++里和普通写法一样,设置导出函数等等,例如c++里有一个函数 int cplusplus(int a,int b),那么在C#里,可以先申明:
[DllImport (abc.dll)]
public extern static int cplusplus(int a,int b);
然后就可以像普通的C#函数一样调用了。有几个需要注意的地方,
1、DllImport 后括号里输入c++ 的dll 的文件名,如果该dll不是在系统目录或者环境变量的目录,或者是c#程序的bin目录里,这里就应该输入完整的路径。建议放到c#的bin目录里。
2、函数必须声明为public的,不要忘记了extern关键字,当然static也所必需的。
反过来,c++是如何调用c#的dll呢,例如c#里有一个函数 public int csharp(int a,int b)在类Pipe下,而Pipe类属于ABC命名空间,那么对于c++项目,首先应该设置项目属性,打开公共语言运行时支持,即/clr标记,然后c++项目中添加c#的dll文件引用,接下来,在cpp文件里添加c#对应函数的命名空间 using namespace ABC;最后就是在需要调用的地方,使用托管代码的方式调用:
Pipe ^p = gcnew Pipe();
int a = p.csharp(3,4);
网上有同学提及编译失败,有一种可能是没有添加dll的引用,如果不喜欢添加引用,那么在cpp 文件里,使用 #using “..\Debug\csharp.dll” 也是一样可以的,不过这里就是用using,而非 include关键字,当然绝对路径也是不可少的。
现在c++和c#相互调用dll的方式就算完成了,有的同学对c++调用c#的dll的方式不太认可。为什么呢,因为要用托管代码的方式。其实上面描述的方法,本质上是使用的COM调用来完成的,微软也给出了直接COM调用的示例,喜欢这种方式的同学不妨琢磨下。