我正在尝试将dll加载到我的python代码中。首先,我安装了python包pythonnet。
py -3.8 -m pip install pythonnet
我在python代码中成功地使用了System.Array:
import sys
import clr, System
from System import Array, Int32
arr = clr.System.Array.CreateInstance(clr.System.Double,3,2)
但是,我无法使用自己的自定义DLL。我的C#库如下所示:
using System;
namespace CsLibrary
{
public class PyWrapper
{
public PyWrapper() { }
public void sayHello() { Console.WriteLine("Hello World"); }
}
}
我可以添加引用
from System.Reflection import Assembly
sys.path.append(r'<path>')
test = Assembly.GetReferencedAssemblies(clr.AddReference(r'CsLibrary'))
print('Dependencies:')
[print(i) for i in test]
print('\nLoaded:')
[print(i) for i in clr.ListAssemblies(False)]
由此产生的产出是:
**Dependencies:**
System.Runtime, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Console, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
**Loaded:**
mscorlib
clrmodule
Python.Runtime
System.Core
System.Configuration
System.Xml
System
__CodeGenerator_Assembly
e__NativeCall_Assembly
CsLibrary (Version=1.0.0.0, Culture=neutral, PublicKeyToken=null)
但是,如果我试图将命名空间加载为一个模块,则会收到错误:ModuleNotFoundError: No模块,名为“CsLibrary”
from CsLibrary import PyWrapper
wrapper = PyWrapper()
wrapper.sayHello()
我想可能是因为缺少依赖关系。因此,我将System.Runtime.dll和System.Console.dll放到CyLibrary.dll的文件夹中,并通过代码强制加载:
dll1 = Assembly.LoadFile(r'<path>\bin\System.Console.dll')
dll2 = Assembly.LoadFile(r'<path>\bin\System.Runtime.dll')
我成功地添加了加载的DLL,但是结果保持不变。我已经尝试过Python3.6、3.8和3.9。我在两台不同的机器上为.NET 5.0、6.0、2.1和3.1创建了.NET库,它们的结果相同:“计算机拒绝”。我不知道还能尝试什么。
我是否需要对在构建过程中创建的.deps.json或.pdb做些什么?PublicKeyToken=null是我应该关心的问题吗?
如果在某种程度上是成功的,我是否可以假设通过C#库执行的代码要比相同的代码要快(如果足够复杂的话)?
您可以找到有关同一问题的一些论坛条目,有些人认为没有使用config.json。config.json的使用在任何地方都没有记录。但是,您可以找到相同的代码片段:Pythonnet dotnet core 'No module named'
from clr_loader import get_coreclr
from pythonnet import set_runtime # no module named pythonnet (requires pythonnet >=v3)
rt = get_coreclr("<path>config.json")
set_runtime(rt) # cannot be called unless pythonnet >=v3.0 is install
我的配置文件看起来应该是(但我还没有使用它):
{
"runtimeOptions": {
"tfm": "netcoreapp3.1",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "3.1.0"
},
"configProperties": {
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false
}
}
}
提前谢谢你。
编辑:i将pythonnet更新为3.0.2b版预发行版。这使我能够访问实际的pythonnet导入(set_runtime)。要创建配置文件,请添加
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
到csproj中的属性。在中的文件。这将为您创建config.json。
发布于 2022-04-25 22:10:13
没有任何配置的import clr
加载.NET框架,而您的DLL似乎是针对.NET (核心) 5的。
此外,pythonnet
2.x不支持.NET核心,也不支持.NET 5+。
https://stackoverflow.com/questions/72004783
复制相似问题