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位也是可以的。涉及到底层通信,就不知道怎么解释了。

时间: 2024-08-28 15:39:25

SOE 中调用第三方dll的相关文章

C# 调用第三方DLL z

http://blog.163.com/[email protected]/blog/static/104072678201311721326318/ 以下代码为本人在实际项目中编写的调用第三方DLL接口程序的完整代码. public class ExecuteDLL : Form { ...//忽略与调用DLL无关的代码 private IntPtr hModule = IntPtr.Zero; /// <summary> /// 调用HIS系统提供的DLL接口程序查看检查申请单 ///DL

Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API,有内存小、速度快、安全、API丰富等8大优点)

文章目录:                   1. 引子: 2. Native Application Demo 展示: 3. Native Application 简介: 4. Native Application 有何妙用: 5. MJ0011 关于 Native Application 的文章整理: 6. 互联网上其他关于 Native Application 的文章整理: 7. 小结: 1. 引子: 其实在好久以前就看了 MJ0011 翻译的那个<Native 应用程序详细>系列的文

dotnetnuke 调用第三方dll出错 System.Security.Permissions.SecurityPermission,型的权限已失败。

在dnn下调用第三方dll的微信sdk ,代码如下: WebClient wc = new WebClient();  wc.Encoding = encoding ?? Encoding.UTF8; wc.DownloadString(url); 在调用 wc.DownloadString(url);时出现 System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, Pu

在.net中调用Delphi dll的Pchar转换

Pchar是非托管代码,要在.net中调用Delphi dll中的功能,请使用MarshalAs属性告知.net调用PInvoke去转换.net中标准的string类型.如果Delphi dll是Delphi2007以前的版本编译的,则Pchar是Ansi类型:如果Delphi dll是Delphi2009以后的版本编译的,则Pchar是Unicode类型.请看以下实例. Ansi类型: [DllImport("my.dll")] [return: MarshalAs(Unmanage

C# 调用第三方DLL缓冲区溢出导致的异常

这个倒是少见的错误,纪录一下大佬. 先上异常 错误一:尝试读取或写入受保护的内存 错误二:未将对象引用设置到对象的实例 错误三:  托管调试助手"FatalExecutionEngineError"(未能截图,网上找的,除了地址都是一样) 在此期间因为排查各种错误,代码删减所以报错才会异常不一样. 上代码: 方法:GetSHA256HashFromString 中间找错就不说了,代码瞎删,环境测试,实例更换 最后发现调用第三方DLL读字节是512,结果给的字节是64字节. 知道了哪里导

利用vs2010制作C语言 dll文件,并在其它程序中调用该dll文件

一.为什么需要dll 代码复用是提高软件开发 效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架, 如ATL.MFC等,它们都以源代码的形式发布.由于这种复用是“源码级别”的,源代码完全暴露给了程序员,因而称之为“白盒复用”.“白盒复用”的缺点 比较多,总结起来有4点. 暴露了源代码: 容易与程序员的“普通”代码发生命名冲突: 多份拷贝,造成存储浪费: 更新功能模块比较困难. 实际上,以上4点概括起来就是

ASP.NET CORE MVC 2.0 项目中引用第三方DLL报错的解决办法 - InvalidOperationException: Cannot find compilation library location for package

目前在学习ASP.NET CORE MVC中,今天看到微软在ASP.NET CORE MVC 2.0中又恢复了允许开发人员引用第三方DLL程序集的功能,感到甚是高兴!于是我急忙写了个Demo想试试,我的项目结构如下: 可以看到解决方案中就两个项目,AspNetCoreWebApp就是一个ASP.NET CORE MVC 2.0的项目,而MyNetCoreLib是一个.Net Core 2.0的类库项目,为了体现AspNetCoreWebApp是通过程序集来引用MyNetCoreLib的,我还在解

在SQL Server 2008中调用.net,dll

T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了.这时可以借助CLR了,我们可以在SQL Server 2008中扩展C#程序来完成循环等过程式的查询,或者其他SQL不便实现的功能.这个随笔中将介绍在SQL Server中扩展C#程序实现正则表达式的替换功能. 新建一个类库程序命名为Regex,打开Visual Studio 2008,点击File,点击New,点击Project,在弹出的New Project对话框中选择Class Libra

C#中调用user32.dll库的keybd_Event函数,操作键盘

keybd_event()的函数原型是: void keybd_event( byte bVk,          //虚拟键码 byte bScan,       //该键的硬件扫描码 dword dwFlags   //函数操作的各个方面的一个标志位集 dword dwExtraInfo  //与击键相关的附加的32位值 ); 其中第三个参数有三种取值: · 0:按下 · 1:扩展键 · 2:弹起 keybd_event(0x41, 0x1e, 0x0000, 0); // 按下 a key