首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pythonnet clr-模块-可以添加引用,但不能加载命名空间模块。

Pythonnet clr-模块-可以添加引用,但不能加载命名空间模块。
EN

Stack Overflow用户
提问于 2022-04-25 19:28:22
回答 1查看 1.3K关注 0票数 0

我正在尝试将dll加载到我的python代码中。首先,我安装了python包pythonnet。

代码语言:javascript
运行
复制
py -3.8 -m pip install pythonnet

我在python代码中成功地使用了System.Array:

代码语言:javascript
运行
复制
import sys
import clr, System
from System import Array, Int32
arr = clr.System.Array.CreateInstance(clr.System.Double,3,2)

但是,我无法使用自己的自定义DLL。我的C#库如下所示:

代码语言:javascript
运行
复制
using System;
namespace CsLibrary
{

    public class PyWrapper 
    {
        public PyWrapper() { }
        public void sayHello() { Console.WriteLine("Hello World"); }
    }
}

我可以添加引用

代码语言:javascript
运行
复制
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)]

由此产生的产出是:

代码语言:javascript
运行
复制
    **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”

代码语言:javascript
运行
复制
from CsLibrary import PyWrapper
wrapper = PyWrapper()
wrapper.sayHello()

我想可能是因为缺少依赖关系。因此,我将System.Runtime.dll和System.Console.dll放到CyLibrary.dll的文件夹中,并通过代码强制加载:

代码语言:javascript
运行
复制
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'

代码语言:javascript
运行
复制
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

我的配置文件看起来应该是(但我还没有使用它):

代码语言:javascript
运行
复制
{
  "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)。要创建配置文件,请添加

代码语言:javascript
运行
复制
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>

到csproj中的属性。在中的文件。这将为您创建config.json。

EN

回答 1

Stack Overflow用户

发布于 2022-04-25 22:10:13

没有任何配置的import clr加载.NET框架,而您的DLL似乎是针对.NET (核心) 5的。

此外,pythonnet 2.x不支持.NET核心,也不支持.NET 5+。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72004783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档