现在的位置: 首页 > 软件测试 > 测试技术 > 软件测试 > 正文

IronPython调用C# DLL函数方法

2014年04月23日 测试技术, 软件测试 ⁄ 共 1886字 ⁄ 字号 暂无评论 ⁄ 阅读 5,681 次

由于Python本身无法直接调用C# DLL(只可调用C/C++ DLL),需要通过IronPython来调用。(还有类似的pythonnet ,有兴趣的同学可以去这里了解下http://pythonnet.sourceforge.net/

1.安装IronPython

IronPython可以说是集成.NET Framework的Python语言,可以同时使用.NET Framework和Python库。

IronPython网址http://ironpython.codeplex.com/,由于安装使用方法与Python一致,在此不做赘述。

2.加载C# DLL

需要加载的C# DLL源码如下(由于详细实现代码较长,在此省略):

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;

namespace Common
{
	public class SimpleHash
	{
		public string HashCalc(byte[] audioBuffer, byte[] key)
		{
			......
			return result;
		}
	}
}

我们需要在IronPython脚本中调用HashCalc函数,Python脚本如下:

import clr
import System

clr.AddReferenceToFile("SimpleHash.dll")
from Common import *

class HashPy(SimpleHash):
  def __init__(self):
    pass

  def HashCalc(self,arg1,arg2):
    #str to byte[]
    arg1=System.Text.Encoding.Default.GetBytes(arg1)
    arg2=System.Text.Encoding.Default.GetBytes(arg2)
    
    return SimpleHash.HashCalc(self,arg1,arg2)

audiobuff='1234567812345678123456781234567812345678123456781234567812345678\
123456781234567812345678123456781234567812345678123456781234567812345678\
123456781234567812345678123456781234567812345678123456781234567812345678\
1234567812345678123456781234567812345678123456781234567812345678'
key='12345678'

print HashPy().HashCalc(audiobuff,key)

详细说明:

1. clr.AddReferenceToFile("SimpleHash.dll") 加载DLL文件

2. from Common import * 导入命名空间

3. 由于C#方法HashCalc不是静态方法,需要先定义类,再进行访问。若HashCalc为静态方法,则IronPython脚本可直接调用:

namespace Common
{
	public class SimpleHash
	{
		public static string HashCalc(byte[] audioBuffer, byte[] key)
		{
			...
			return ToHex(result, 32);
		}
	}
}
clr.AddReferenceToFile("SimpleHash.dll")
from Common import *
…
SimpleHash. HashCalc(audiobuff,key)

4. C#方法参数为byte[]格式,需要将str转换为byte[]格式,否则会报错“TypeError: expected Array[Byte], got str”,相互转换代码如下:

import System
#String To Byte[]:
byte[] byteArray = System.Text.Encoding.Default.GetBytes(str);
#Byte[] To String:
string str = System.Text.Encoding.Default.GetString(byteArray);

5. 最后运行结果如下

IronPython