【发布时间】:2017-12-15 13:06:44
【问题描述】:
这个问题与我无法分享的敏感数据有关,但问题很简单。我正在开发 PyCharm 2017.1.2、python 2.7.13。
我有一个特定格式的文件(一种加密的 XML,无法解析),需要将其转换为 Excel 以修改某些值,然后将其导出回原始格式。出于某些安全原因,我无法绕过这种转换。很好,我有一个 Excel 加载项,我可以在两个 C# DLL 中使用它,它可以“导入”到 Excel 格式并将其“导出”回奇怪的 XML。
我也不能使用 IronPython,因为我正在设计的软件使用库 IronPython 无法管理,所以我坚持使用旧的 Python 2.7。
我目前正在使用来自 pythonnet 的 clr 模块将 DLL 导入我的软件。导入代码(不明智)如下所示:
import clr
import sys
sys.path.append('C:/My/Path/To/The/DLLs/Folder')
clr.AddReference('Microsoft.Office.Interop.Excel, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c')
clr.AddReference('My.ClassLib.DLL')
clr.AddReference('My.ExcelImportExport.DLL')
import Microsoft.Office.Interop.Excel as Excel
try:
from My.ClassLib.DLL import XMLParser
import My.ExcelImportExport.DLL
from My.ExcelImportExport.DLL import DeviceSettingsUtility
except Exception, e:
print unicode(e)
我正在使用的两个 DLL 都位于同一个文件夹中。 CLR 添加 DLL 引用没有问题。
奇怪的是:'My.ClassLib.DLL' 一切正常:我可以毫无问题地访问它的类和方法。
但是,一旦我尝试import My.ExcelImportExport.DLL 或之后的行,我就有了ImportError: No module named My.ExcelImportExport.DLL。当使用 clr 添加引用后,我列出所有程序集时,我同时看到 My.ClassLib.DLL 和 My.ExcelImportExport.DLL,所以问题不来自这里。问题来自My.ExcelImportExport.DLL。
我用反编译器查看了这两个 DLL,但没有发现任何使 ClassLib.DLL 工作的东西,并解释了为什么另一个不工作。
最后,我的问题是:DLL(C# 代码)中需要什么才能让 clr 能够导入它?
【问题讨论】:
-
您的 .NET 类实际上是否命名为“DLL”?通常,在添加对 DLL 的引用后,而不是
from My.ExcelImportExport.DLL import DeviceSettingsUtility,我希望看到类似from My.ExcelImportExport import DeviceSettingsUtility的内容。 -
我也有同样的问题。 pythonnet/wiki 页面似乎没有帮助。还有一点需要注意: clr.__dict__ 或 help(clr) 列出了一些可以正常工作的模块,但是 clr.ListAssemblies 列出了更多的程序集,包括我无法使用的程序集。似乎很多程序集都可以通过 clr 加载,但不能用作 Python 中的模块。有什么区别?
标签: python .net pycharm clr python.net