这个问题与我无法分享的合理数据有关,但问题很简单。我正在研究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?
您必须尝试使用最新版本的pythonnet,您可以使用链接从github获得 https://github.com/pythonnet/pythonnet/wiki/Installation
我相信这将起作用,因为我使用的是python版本3.8.8
Pythonnet 使用 NAMESPACES 作为模块。不是类或任何东西。它们是clr
的子模块.
import clr
clr.System.Console.WriteLine("foo.bar.baz")
我发现它可能取决于.NET框架版本。
在这种情况下:
- 蟒蛇 3.8.10
- pythonnet 2.5.2
类库的目标框架:
.NET 标准 1.0、- 1.6、2.0:工作正常
- .NET 标准 2.1:失败
使用计算 DLL 示例进行测试: https://github.com/pythonnet/pythonnet/wiki/How-to-call-a-dynamic-library