20

我正在使用 CPython,并且我有一个 C# dll。我正在尝试使用 Python for .NET 让他们说话。我不能使用 IronPython,因为我需要将它集成到现有的 CPython 系统中。

我对 Python for .NET 完全陌生,实际上我对 Python 的经验很少,对 C# 也没有经验。所以如果我的问题看起来很基本,请原谅我。

我正在使用 Python 2.7.3,我下载了 pythonnet-2.0-alpha2-clr2.0_131_py27_UCS2 并将其解压缩到一个名为 pyfornet_test 的文件夹中,该文件夹还包含我正在尝试使用的 dll(称为 DotNet4Class.dll)

然后我运行这个:

import sys

import os

import clr

sys.path.append(r"C:\pyfornet_test")

clr.AddReference("DotNet4Class.dll")

这给了我这个错误:

System.IO.FileNotFoundException: Unable to find assembly 'DotNet4Class.dll'.
   at Python.Runtime.CLRModule.AddReference(String name) in C:\Users\Barton\Documents\Visual Studio 2008\Projects\PyShar
p\trunk\pythonnet\src\runtime\moduleobject.cs:line 375

任何建议将不胜感激。谢谢!

4

7 回答 7

17

一个原因可能是 Windows 没有允许它从“外部源”加载。要解决这个问题:

  • 右键单击.dll
  • “特性”
  • 在“常规”下,单击“取消阻止”
于 2019-10-14T08:56:38.067 回答
16

试试这个(不带扩展名.dll):

clr.AddReference(r"C:\pyfornet_test\DotNet4Class")
于 2013-04-24T06:58:39.230 回答
7

DotNet4Class.dll针对 .NET 4 构建的吗?我假设是基于 dll 的命名。

注意这里的问题:http: //sourceforge.net/tracker/ ?func=detail&aid=3293169&group_id=162464&atid=823891

使用 .NET 4.0 构建程序集时,clr.AddReference 失败 - ID:3293169

我已经阅读了解决方案,但本质上,您需要在 .NET 4 下为 .NET 项目重建和重新编译 python。

我还要提到,像这样的项目,没有被很多人积极开发和使用,通常具有微妙的特质,使得了解平台对于解决此类问题至关重要。听起来您正在尝试破解此解决方案,但对 python 或 .NET 的了解并不多,这总是充满问题。

于 2012-11-06T21:47:38.273 回答
5

我有这样的代码(我将 MyRightClickMenuService.dll 复制到与我相同的目录中script.py)。它是针对 .Net 4.0 构建的。

# script.py
import clr
import os
import sys
sys.path.append(os.path.dirname(__file__))

clr.AddReference('MyRightClickMenuService')
clr.AddReference('System')
clr.AddReference('System.Security')

from MyRightClickMenuService import (
    AclSecuredNamedPipeBinding,
    MyMenuItem,
    MyContextMenuService,
    etc
)
于 2014-11-27T01:21:28.590 回答
5

你试过 clr.FindAssembly 吗?

import clr
import sys
assemblydir = r"C:\pyfornet_test"
assemblypath = r"C:\pyfornet_test\DotNet4Class.dll"
sys.path.append(assemblydir)
clr.FindAssembly(assemblypath)

我不知道它为什么有效,但这段代码在我的电脑上有效(Python 2.7、.NET4)

于 2015-06-25T09:28:05.373 回答
4

清单

  1. sys.path在加载之前添加包含 DLL 的文件夹。您可以附加或sys.path.insert(0, dll_folder)将其放在列表的首位。
  2. 在将文件夹添加到 sys.path,您在clr.AddReference('my_dll') 没有dll 扩展名(for my_dll.dll)的情况下调用
  3. DLL 目标体系结构与 CPython 版本位数相同。也就是说,如果 Architecture 是x64,则使用64 位python,如果 Architecture 是x86,则使用32 位python。(下面的说明)

如何检查 DLL 的目标体系结构?

  • 我使用了 ILSpy(免费和开源)-> 打开 DLL -> 检查输出。下面的示例输出。

ILSpy 示例

于 2020-04-13T18:56:20.987 回答
0

对我有用的是取消阻止 dll 文件。

如果你下载 dll 文件或从不同的计算机上获取它,它可能会被阻止。所以畅通无阻为我解决了这个问题。

要取消阻止,请右键单击 dll 文件的属性并选中底部的取消阻止框

于 2021-07-22T09:51:57.720 回答