我在使用Python通过Python for .NET加载外部DLL时遇到问题.我已经尝试了stackoverflow之后的类似方法.我将尝试总结情况并描述我所做的所有步骤.
我有一个以例如Test.NET.dll命名的dll.我查看了dotPeek,我可以看到,点击它,x64和.NET Framework v4.5.在我的计算机上,我安装了.Net Framework 4.
我还以不同的方式安装了Python for .NET.我认为最好的是从这个网站LINK下载.whl .我已经下载并安装了:pythonnet-2.0.0.dev1-cp27-none-win_amd64.whl.我可以想象它将适用于.NET 4.0,因为需要Microsoft .NET Framework 4.0.
一旦我安装了所有东西,我就可以执行以下命令:
>>> import clr
>>> import System
>>> print System.Environmnet.Version
>>> print System.Environment.Version
4.0.30319.34209
Run Code Online (Sandbox Code Playgroud)
看起来很有效.然后,我试图加载我的DLL键入这些命令:
>>> import clr
>>> dllpath= r'C:\Program Files\API\Test.NET'
>>> clr.AddReference(dllpath)
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
clr.AddReference(dllpath)
FileNotFoundException: Unable to find assembly 'C:\Program Files\API\Test.NET'.
at Python.Runtime.CLRModule.AddReference(String name)
Run Code Online (Sandbox Code Playgroud)
我还尝试在路径的末尾添加".dll",但没有任何改变.然后,我也尝试了LINK,LINK,LINK等等中描述的不同解决方案....不幸的是,它不起作用,我得到了不同的错误.我知道存在IronPython但我试图避免使用它.
谢谢你的帮助!
我有一个.cs文件
namespace SomeNamepace
{
public struct SomeStruct
{
....
}
public static class SomeClass
{
....
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我使用它与PythonNET一样
import clr
clr.AddReference('c:\\Test\Module.dll')
from SomeNamepace import SomeClass, SomeStruct
SomeClass.SomeMethod(...)
Run Code Online (Sandbox Code Playgroud)
我现在的问题是我需要使用具有相同名称且没有设置版本号的dll,因此PythonNET不会将它们视为两个不同的dll,而是相同.即使我使用AddReference的完整路径导入它们.
现在我想明确地使用它们,如下所述:
Python for .NET:在多个版本中使用相同的.NET程序集
喜欢
lib = clr.AddReference('c:\\Test\Module.dll')
Run Code Online (Sandbox Code Playgroud)
我尝试了很多东西来创建一个SomeClass类似的实例
lib.SomeNamespace.SomeClass()
Run Code Online (Sandbox Code Playgroud)
要么
import System
System.Activator.CreateInstance(lib.GetType('SomeNamespace.SomeClass'))
Run Code Online (Sandbox Code Playgroud)
或使用方法Initialize或CreateInstance
或者如下面的链接中所述
from System import Type
type1 = lib.GetType('SomeNamespace.SomeClass')
constructor1 = type1.GetConstructor(Type.EmptyTypes)
Run Code Online (Sandbox Code Playgroud)
最后一切都失败了,没找到的东西,没有方法等等.
这样做的正确语法是什么?
我正在尝试使用 clr 模块中的 AddReference('example_file') 方法添加对“example_file.dll”的引用:
>>>import clr
>>>clr.AddReference('example_file')
Run Code Online (Sandbox Code Playgroud)
结果我得到:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
System.IO.FileNotFoundException: Unable to find assembly 'example_file'.
at Python.Runtime.CLRModule.AddReference(String name)
Run Code Online (Sandbox Code Playgroud)
所有文件都位于当前工作目录中,sys.path 如下所示:
>>> sys.path
['', 'C:\\Python27\\lib\\site-packages\\pip-1.2.1-py2.7.egg', 'C:\\Python27', 'C
:\\Windows\\system32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib',
'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27\\lib\\
site-packages', 'C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\']
Run Code Online (Sandbox Code Playgroud)
此外,由于:
>>>clr.FindAssembly('example_file')
Run Code Online (Sandbox Code Playgroud)
我明白了
u'example_file.dll
Run Code Online (Sandbox Code Playgroud)
问题一天天出现。我很困惑,因为它以前工作得很好 - 我不知道什么会对此产生影响。我正在使用 Windows 7 x64、python 2.73 和 .Net Framework 4