SOE 中调用第三方dll
一、简介
在利用soe实现server的扩展的时候,有些时候,需要调用第三方的dll库。官网中给出了明确的说明,soe中是可以添加第三方的dll文件,但是一直没有测试。按照官方的步骤应该是一个非常的简单的步骤。官方的步骤,参考连接如下:点击我
但是在实际测试的过程中发现并不如官方的步骤如此简单。其中涉及一个非常重要的东西,就是强签名。
二、强签名密钥
在新建soe模板工程后,可以在工程目录下看到一个名为myKey.snk 文件。snk一言以蔽之,为了防止自己的应用程序被篡改,就是给自己的应用程序加了一个token密钥。只有token密钥匹配才能在程序中引用。
强签名的程序集有个特性,就是不会调用没有签名的程序集,也就是说在soe中调用的dll第三方库,必须也是强签名过的,且签名证书与soe模板生成的证书是匹配的。如果不匹配在编译soe的时候会出现如下的错误:
三、dll添加强签名
在实际的过程中,有的dll是有源码的,有的是没有源码。根据这两种情况,生成强签名的方式有如下两种方式
1. 有源码的dll
有源码的这种情况,相对来说比较简单,在vs中打开项目,在项目上右击-properities-singing中,勾选复选框。选择soe模板文件生成的签名文件。重新build项目即可。如下图所示
2. 没有源码的dll
还有的dll文件没有源码,且没有强签名。这个时候如果要给待引用的dll文件添加soe的强签名,需要先将dll文件通过反汇编工具,汇编成il代码文件,然后给il文件添加强签名,然后重新编译生成强签名的dll。这也是snk这种方式不安全地方所在,就是通过反汇编,可以更改源码。
具体的操作如下,
首先,使用vs sdk tool中 反汇编工具,生成il文件
在弹出的工具中打开dll文件,然后file-dump保存后缀为.il 的文件,使用utf-8保存
习惯使用命令行的可以,可以使用如下命令
ildasm ClassLibrary.dll /utf-8 ClassLibrary.il
请注意这些命令行并不是在cmd中执行,而是vs的命令行工具。如下图所示。
接下来就是给反编译的il添加soe的证书,命令如下
ilasm /dll /key=myKey.snk ClassLibrary.il /out=ClassLibrary.dll
最后将新生产的dll,添加到soe项目中编译即可。本满怀欣喜的以为可以了但是执行soe的时候,出现了如下错误
这个错误耽误了我很久的时间。因为从soe文件中,可以看到新的dll已经打包进去,但是soe工程确找不到文件。
通过将这种方式重新生产的dll与有源码直接vs编译的dll通过反编译工具reflactor进行反编译对比。发现两者的runtime的版本是不一样。通过vs编译的其runtime的版本是2.0,而ilasm生产的runtime是4.0,而soe的开发版本才有的runtime的版本是3.5,故导致该问题。
究其原因,发现每个runtime sdk的下面都有ilasm.exe 文件,而我不知不觉的使用的runtime framework 4.0的。
ilasm.exe 的目录格式如下:
C:\Windows\Microsoft.NET\Framework\v2.0.50727,将上面的命令替换如下:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\ilasm.exe /dll /key=myKey.snk ClassLibrary.il /out=ClassLibrary.dll
即可。
四、参考:
1.http://www.cnblogs.com/zjoch/archive/2012/08/28/2660358.html
2.http://msdn.microsoft.com/zh-cn/library/6f05ezxy(v=vs.110).aspx
3. http://blog.csdn.net/a497785609/article/details/8662295
五、总结
在测试这个过程中,我顺便测试了下dll的平台版本。按道理来说,server是64位,其能调用的dll的版本应该也是64的,但是实际我测试了32位也是可以的。涉及到底层通信,就不知道怎么解释了。
SOE 中调用第三方dll的更多相关文章
- Java调用第三方dll文件的使用方法 System.load()或System.loadLibrary()
Java调用第三方dll文件的使用方法 public class OtherAdapter { static { //System.loadLibrary("Connector") ...
- C# 调用第三方DLL完整实例
C# 调用第三方DLL完整实例 分类: C/C++ 以下代码为本人在实际项目中编写的调用第三方DLL接口程序的完整代码. public class ExecuteDLL : Form { ...//忽 ...
- Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API,有内存小、速度快、安全、API丰富等8大优点)
文章目录: 1. 引子: 2. Native Application Demo 展示: 3. Native Application 简介: 4. Native Ap ...
- C# 调用第三方DLL z
http://blog.163.com/da7_1@126/blog/static/104072678201311721326318/ 以下代码为本人在实际项目中编写的调用第三方DLL接口程序的完整代 ...
- dotnetnuke 调用第三方dll出错 System.Security.Permissions.SecurityPermission,型的权限已失败。
在dnn下调用第三方dll的微信sdk ,代码如下: WebClient wc = new WebClient(); wc.Encoding = encoding ?? Encoding.UTF8; ...
- 在.net中调用Delphi dll的Pchar转换
Pchar是非托管代码,要在.net中调用Delphi dll中的功能,请使用MarshalAs属性告知.net调用PInvoke去转换.net中标准的string类型.如果Delphi dll是De ...
- 在SQL Server 2008中调用.net,dll
原文:在SQL Server 2008中调用.net,dll T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了.这时可以借助CLR了,我们可以在SQ ...
- C# 调用第三方DLL缓冲区溢出导致的异常
这个倒是少见的错误,纪录一下大佬. 先上异常 错误一:尝试读取或写入受保护的内存 错误二:未将对象引用设置到对象的实例 错误三: 托管调试助手“FatalExecutionEngineError”( ...
- C#中调用unmanaged DLL
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
随机推荐
- Eclipse中屏蔽日志
如何在Eclipse中屏蔽日志 //屏蔽日志 Eclipse Java import org.apache.log4j.Level; import org.apache.log4j.Logger; L ...
- IoC容器Autofac学习笔记
一.一个没有使用IoC的例子 IoC的全称是Inversion of Control,中文叫控制反转.要理解控制反转,可以看看非控制反转的一个例子. public class MPGMovieList ...
- Atitit. 脚本语言的断点单步调试的设计与实现 attialx 总结 php 参照java
Atitit. 脚本语言的断点单步调试的设计与实现 attialx 总结 php 参照java 1. 断点的实现:手动断点 die和exit是等价的 1 2. 变量表的实现 1 3. print_r( ...
- oracle TABLE ACCESS BY INDEX ROWID 你不知道的索引回表-开发系列(三)
1 引言 近期系统常常提示一个sql查询时间过长的问题,看了一下就是一个每天依照时间戳统计前一天量的sql. 表总的数据量为53483065. 语句例如以下: select count(x.seria ...
- python学习之join()
str.join(iterable) 该方法用来分隔字符串的. 例子 >>> b':'.join((b'leo',b'999')) b'leo:999' >>> ' ...
- linux命令之高级使用 service
service命令,顾名思义,就是用于管理Linux操作系统中服务的命令. 1. 声明:这个命令不是在所有的linux发行版本中都有.主要是在redhat.fedora.mandriva和centos ...
- 文本识别OCR浅析:特征篇
OCR技术浅探:特征提取(1) 研究背景 关于光学字符识别(Optical Character Recognition, 下面都简称OCR),是指将图像上的文字转化为计算机可编辑的文字内容,众多的研究 ...
- [Idea Fragments]2013.08.08
# 1 今晚看到好几篇文章把golang,Node.js还有Nginx-lua拿来说事,Node.js现在自然比较熟悉,golang则有过一些了解,而Nginx-lua则少有听到. 有好事者对Node ...
- 【vijos】1892 树上的最大匹配(树形dp+计数)
https://vijos.org/p/1892 这个必须得卡评测机+手动开栈才能卡过QAQ 手动开栈我百度的... int size=256<<20; //256MB char *p=( ...
- NLM算法
non-Local Means 非局部均值 论文原文:http://www.ipol.im/pub/art/2011/bcm_nlm/?utm_source=doi 论文源代码:http://www. ...