Python调用C# Com dll组件的过程详解


本文摘自php中文网,作者黄舟,侵删。

下面小编就为大家带来一篇Python调用C# Com dll组件实战教程。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

之前公司有套C# AES加解密方案,但是方案加密用的是Rijndael类,而非AES的四种模式(ECB、CBC、CFB、OFB,这四种用的是RijndaelManaged类),Python下Crypto库AES也只有这四种模式,进而Python下无法实现C# AES Rijndael类加密效果了。

类似于这种C# 能实现的功能而在Python下实现不了的,搜集资料有两种解决方案,第一种方式,使用IronPython 直接调用C# dll文件,教程网上很多,不在赘述了,这种方式有个缺点,用的是ironPython而非Python,只是集成了一些.net framework库的Python版本,更新维护少;第二种方式是,C# dll源码编译成Com组件,Python再调用COM组件Dll的方法。

网上有很多Python调用COM dll教程,但大部分是C或C++编写的dll,很少有比较全面的讲解COM组件生成至调用过程,下面结合自己摸索多天的经历,简单介绍下如何生成COM组件,以及用Python如何调用COM dll组件,分享给大家。

我也是小白 ……^ ^,高手请飘过,如有写的不对之处,还请多多包涵以指正...

1.如何生成C# COM组件

我用的是Microsoft visual studio 2010, 首先新建--项目--选择【类库】,名称自定义:ComToPython,点击【确定】

重命名cs文件:ComToPython.cs,可自定义。 弹窗选择【是】

COM可见性设置为 True:

上面等同于以下项目属性设置:

勾选“为COM互操作注册”:

新建签名ComToPythonKey,取消勾选 “使用密码保护密钥文件”

编写接口类IMyClass,ComToPython类实现接口的三个方法,例如Add()方法就是我们想要实现的功能,返回a与b之和。

ComToPython类之前的[ClassInterface(ClassInterfaceType.None)]一定要有,否则Python调用时会报错。

[ProgId("ComToPython.Application")]指定Python调用COM时的名称,后面Python代码会看到。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Runtime.InteropServices;

  

namespace ComToPython

{

  [Guid("350779B9-8AB5-4951-83DA-4CBC4AD860F4")]

  public interface IMyClass

  {

    void Initialize();

    void Dispose();

    int Add(int x, int y);

  }

  

  [ClassInterface(ClassInterfaceType.None)]

  [Guid("16D9A0AD-66B3-4A8A-B6C4-67C9ED0F4BE4")]

  [ProgId("ComToPython.Application")]

  public class ComToPython: IMyClass

  {

    public void Initialize()

    {

      // nothing to do

    }

  

    public void Dispose()

    {

      // nothing to do

    }

  

    public int Add(int x, int y)

    {

      return x + y;

    }

  }

}

GUID使用VS2010自带工具生成,工具--创建GUID,点击复制两个GUID分别放至两个类名之前

注:点击新建GUID,可复制新建后的GUID:

最后F6编译生成解决方案,在你的工程Debug目录下会有ComToPython.dll生成:

最后一步注册COM组件至系统

开始菜单--打开VS 2010 自带CMD命令窗口(管理员权限)定位至ComToPython.dll文件夹下

执行:gacutil /i ComToPython.dll 添加dll至全局缓存

执行:regasmComToPython.dll 注册dll至系统

2.Python如何调用COM dll组件

我用的是Python 2.7,IDE用的PyCharm 2017.1,PyCharm新建--项目ComToPython,新建项目py文件ComToPython.py

设置--添加两个依赖库:

添加安装pywin32和comtypes依赖库,以对应后面的两种调用COM组件方式:

依赖装好后,Python安装目录site-packages目录下会有个win32com文件夹,双击C:\Python27\Lib\site-packages\win32com\client\下的makepy.py

选择ComToPython,点击OK

然后拷贝上面VS2010生成的COM组件ComToPython.dll至PyCharm ComToPython项目文件夹下:

编写python调用COM dll代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#!/usr/bin/env python

# -*- coding: utf-8 -*-

a=1

b=2

print "方法一:"

from win32com.client import Dispatch

dll = Dispatch("ComToPython.Application")

result = dll.Add(a, b)

print "a + b = " + str(result)

 

print "方法二:"

import comtypes.client

dll = comtypes.client.CreateObject('ComToPython.Application')

result = dll.Add(a, b)

print "a + b = " + str(result)

运行代码,执行结果如下:

以上就是Python调用C# COM Dll整个过程了

以上就是Python调用C# Com dll组件的过程详解的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

实例讲解Python如何利用pandas查询数据

Python的format什么意思

pytho 中闭包与装饰器详解

Python实现的端口扫描功能

Python基础教程项目三之万能的xml

如何使用 pylint 来规范 Python 代码风格(来自ibm)_Python

教你用Python创建微信聊天机器人

趣味玩转——用Python分析《三国演义》中的社交网络

isinstance在Python中的意思是什么?

Python怎么安装netcdf4?

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...