2 lihehiei lihehiei 于 2016.04.13 23:56 提问

关于python调用C#库的问题 5C

 大家好,我需要用python来调用C#的.dll,一直在研究http://blog.csdn.net/xugangjava/article/details/7202356这篇文章,现在碰到了一个问题,请大家帮忙出出主意,谢谢。

 首先是这篇文章中的最末尾,命令行中有一条“d.EncryptMd5('dsaf')”(如图1)。请问这个"d."是从何而来?之前也没有看到任何类例化成了"d"?

图1:
图片说明

 其次是我在调用由C# COM生成的.py文件中的方法时,出现了“CoClassBaseClass”类能正常例化,而“DispatchBaseClass”无法正常例化的情况(如图2和图3),请问这是为什么?如何才是正确的调用方法?

图2:
图片说明

图3:
图片说明

以下是用makepy转化C# COM生成的.py:

 # -*- coding: mbcs -*-
# Created by makepy.py version 0.5.01
# By python version 2.7.4 (default, Apr  6 2013, 19:54:46) [MSC v.1500 32 bit (Intel)]
# From type library 'testCom.tlb'
# On Wed Apr 13 16:58:28 2016
''
makepy_version = '0.5.01'
python_version = 0x20704f0

import win32com.client.CLSIDToClass, pythoncom, pywintypes
import win32com.client.util
from pywintypes import IID
from win32com.client import Dispatch

# The following 3 lines may need tweaking for the particular server
# Candidates are pythoncom.Missing, .Empty and .ArgNotFound
defaultNamedOptArg=pythoncom.Empty
defaultNamedNotOptArg=pythoncom.Empty
defaultUnnamedArg=pythoncom.Empty

CLSID = IID('{95A0DC02-9D6B-4A40-A78A-C65357E749F5}')
MajorVersion = 1
MinorVersion = 0
LibraryFlags = 8
LCID = 0x0

from win32com.client import DispatchBaseClass
class IMyClass(DispatchBaseClass):
    CLSID = IID('{88DB152F-BC26-43C9-BED0-B6CDE14D85CF}')
    coclass_clsid = None

    def Add(self, x=defaultNamedNotOptArg, y=defaultNamedNotOptArg):
        return self._oleobj_.InvokeTypes(1610743808, LCID, 1, (3, 0), ((3, 1), (3, 1)),x
            , y)

    _prop_map_get_ = {
    }
    _prop_map_put_ = {
    }
    def __iter__(self):
        "Return a Python iterator for this object"
        try:
            ob = self._oleobj_.InvokeTypes(-4,LCID,3,(13, 10),())
        except pythoncom.error:
            raise TypeError("This object does not support enumeration")
        return win32com.client.util.Iterator(ob, None)

class _ComTest(DispatchBaseClass):
    CLSID = IID('{8069ED53-4C67-3611-BB38-AB9721C851EB}')
    coclass_clsid = IID('{20CEDF1F-BB34-4D68-B657-3884B6E84C4C}')

    _prop_map_get_ = {
    }
    _prop_map_put_ = {
    }
    def __iter__(self):
        "Return a Python iterator for this object"
        try:
            ob = self._oleobj_.InvokeTypes(-4,LCID,3,(13, 10),())
        except pythoncom.error:
            raise TypeError("This object does not support enumeration")
        return win32com.client.util.Iterator(ob, None)

class _Object(DispatchBaseClass):
    CLSID = IID('{65074F7F-63C0-304E-AF0A-D51741CB4A8D}')
    coclass_clsid = IID('{20CEDF1F-BB34-4D68-B657-3884B6E84C4C}')

    def Equals(self, obj=defaultNamedNotOptArg):
        return self._oleobj_.InvokeTypes(1610743809, LCID, 1, (11, 0), ((12, 1),),obj
            )

    def GetHashCode(self):
        return self._oleobj_.InvokeTypes(1610743810, LCID, 1, (3, 0), (),)

    # Result is of type _Type
    def GetType(self):
        ret = self._oleobj_.InvokeTypes(1610743811, LCID, 1, (13, 0), (),)
        if ret is not None:
            # See if this IUnknown is really an IDispatch
            try:
                ret = ret.QueryInterface(pythoncom.IID_IDispatch)
            except pythoncom.error:
                return ret
            ret = Dispatch(ret, u'GetType', '{BCA8B44D-AAD6-3A86-8AB7-03349F4F2DA2}')
        return ret

    _prop_map_get_ = {
        "ToString": (0, 2, (8, 0), (), "ToString", None),
    }
    _prop_map_put_ = {
    }
    # Default property for this class is 'ToString'
    def __call__(self):
        return self._ApplyTypes_(*(0, 2, (8, 0), (), "ToString", None))
    def __unicode__(self, *args):
        try:
            return unicode(self.__call__(*args))
        except pythoncom.com_error:
            return repr(self)
    def __str__(self, *args):
        return str(self.__unicode__(*args))
    def __int__(self, *args):
        return int(self.__call__(*args))
    def __iter__(self):
        "Return a Python iterator for this object"
        try:
            ob = self._oleobj_.InvokeTypes(-4,LCID,3,(13, 10),())
        except pythoncom.error:
            raise TypeError("This object does not support enumeration")
        return win32com.client.util.Iterator(ob, None)

from win32com.client import CoClassBaseClass
# This CoClass is known by the name 'testCom.ComTest'
class ComTest(CoClassBaseClass): # A CoClass
    CLSID = IID('{20CEDF1F-BB34-4D68-B657-3884B6E84C4C}')
    coclass_sources = [
    ]
    coclass_interfaces = [
        _ComTest,
        _Object,
    ]
    default_interface = _ComTest

IMyClass_vtables_dispatch_ = 1
IMyClass_vtables_ = [
    (( u'Add' , u'x' , u'y' , u'pRetVal' , ), 1610743808, (1610743808, (), [ 
            (3, 1, None, None) , (3, 1, None, None) , (16387, 10, None, None) , ], 1 , 1 , 4 , 0 , 28 , (3, 0, None, None) , 0 , )),
]

_ComTest_vtables_dispatch_ = 1
_ComTest_vtables_ = [
]

_Object_vtables_dispatch_ = 1
_Object_vtables_ = [
    (( u'ToString' , u'pRetVal' , ), 0, (0, (), [ (16392, 10, None, None) , ], 1 , 2 , 4 , 0 , 28 , (3, 0, None, None) , 0 , )),
    (( u'Equals' , u'obj' , u'pRetVal' , ), 1610743809, (1610743809, (), [ (12, 1, None, None) , 
            (16395, 10, None, None) , ], 1 , 1 , 4 , 0 , 32 , (3, 0, None, None) , 0 , )),
    (( u'GetHashCode' , u'pRetVal' , ), 1610743810, (1610743810, (), [ (16387, 10, None, None) , ], 1 , 1 , 4 , 0 , 36 , (3, 0, None, None) , 0 , )),
    (( u'GetType' , u'pRetVal' , ), 1610743811, (1610743811, (), [ (16397, 10, None, "IID('{BCA8B44D-AAD6-3A86-8AB7-03349F4F2DA2}')") , ], 1 , 1 , 4 , 0 , 40 , (3, 0, None, None) , 0 , )),
]

RecordMap = {
}

CLSIDToClassMap = {
    '{20CEDF1F-BB34-4D68-B657-3884B6E84C4C}' : ComTest,
    '{88DB152F-BC26-43C9-BED0-B6CDE14D85CF}' : IMyClass,
    '{8069ED53-4C67-3611-BB38-AB9721C851EB}' : _ComTest,
    '{65074F7F-63C0-304E-AF0A-D51741CB4A8D}' : _Object,
}
CLSIDToPackageMap = {}
win32com.client.CLSIDToClass.RegisterCLSIDsFromDict( CLSIDToClassMap )
VTablesToPackageMap = {}
VTablesToClassMap = {
    '{88DB152F-BC26-43C9-BED0-B6CDE14D85CF}' : 'IMyClass',
    '{8069ED53-4C67-3611-BB38-AB9721C851EB}' : '_ComTest',
    '{65074F7F-63C0-304E-AF0A-D51741CB4A8D}' : '_Object',
}


NamesToIIDMap = {
    'IMyClass' : '{88DB152F-BC26-43C9-BED0-B6CDE14D85CF}',
    '_ComTest' : '{8069ED53-4C67-3611-BB38-AB9721C851EB}',
    '_Object' : '{65074F7F-63C0-304E-AF0A-D51741CB4A8D}',
}

2个回答

devmiao
devmiao   Ds   Rxr 2016.04.13 23:57
lihehiei
lihehiei 谢谢回答,不过我这个程序是跑在树莓派上的,所以用不了IronPython,还是请您帮忙看看我的问题怎么解决,谢谢
2 年多之前 回复
CSDNXIAON
CSDNXIAON   2016.04.14 00:02

C# 调用 Fortran 写的算法库的问题
vb.net / C# 调用 python
在C#中调用python方法
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
python调用C# Com 的dll
dll源程序 可查看 文章> http://blog.csdn.net/xugangjava/article/details/7067413 首先 运行 工具 makepy.py 这样就可以查看 C# dll的 com导出的 py文件了 查看 # -*- coding: mbcs -*- # Created by makepy.py version 0.5.0
c#与python 交互(调用第三方库失败,自己奋战了三天以失败而结尾,但是还是有些干货)-如果有人弄出来请告诉我
本人编程环境:VS2010 +anaconda 对于C#调用python 的想法是:c#拥有制作ui的优势,不管是winform 还是wpf,而Python做界面比较复杂,所以我想的是如果能调用python的一些第三方库,如 Numpy、scipy 等一些计算库引入,那么我用c#见面读取数据,把数据交给后台python处理,如回归、分类,然后再把数据传回来。也就是数据层、逻辑层交给pytho
Python调用C# Com dll组件实战
类似于这种C# 能实现的功能而在Python下实现不了的,搜集资料有两种解决方案,第一种方式,使用IronPython 直接调用C# dll文件,教程网上很多,不在赘述了,这种方式有个缺点,用的是ironPython而非Python,只是集成了一些.net framework库的Python版本,更新维护少;第二种方式是,C# dll源码编译成Com组件,Python再调用COM组件Dll的方法。 网上有很多Python调用COM dll教程,但大部分是C或C++编写的dll,很少有比较全面的
2017.10.11 C#调用C++ 动态库内存溢出问题
最近在写C#调用C++ 动态库的例子,发现使用Stringbuider 时,重复使用时容易造成内存溢出的问题,网上查了之后 发现可以使用 Stringbuider .Remove(0, Stringbuider .Length)方法,但是经过测试后并没有解决问题。 后来经过仔细分析,发现使用 StringBuilder cRegResult = new StringBuilder(512);
IronPython 与 c# 交互之导入Python模块的两种方法
当我们要在C#中调用python时,有时候需要用到python里的一些函数,比如进行一些数学运算,开方,取对数,这个时候我们需要用到python里的math模块(类似C#的命名空间,但概念不完全一样).那么在C#中要导入python的模块有两种方法方法一ScriptSource source = engine.CreateScriptSourceFro
Python调用.NET库
开发背景是这样的:整个项目中使用很多台摩托罗拉的RFID读卡器,我要为这些读卡器写一个管理程序,判断是否有RFID标签进入或离开某个区域。用户提供给我的,除了设备,就是一个.net的动态库文件。经朋友指点,安装了.NET Framework 4.0和IronPython 2.7之后,终于可以调用.net库了。我不确定的是,python环境下那些打包工具是否还是使用,因为脚本要在IronPython的
Python 调用.net framework写的类库的方法
 版权声明请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。 Python 调用.net framework写的类库的方法1. 安装python2.5和对应的pywin32安装方法:略。 2. 下载ironPython源代码 是C#的。我用的是IronPython1.1的版本,
python第三方库numpy的使用
numpy的使用
IronPython-2.7.5
C#调用Python
PCL点云库(Point Cloud Library)介绍
PCL(Point Cloud Library)是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。支持多种操作系统平台,可在Windows、Linux、Android、Mac OS X、部分嵌入式实时系统上运行。如果说OpenCV是2D信息获取与处