Используйте .Net (C #) dll в скрипте Python - PullRequest
5 голосов
/ 26 апреля 2011

Я пытаюсь перенести простую утилиту командной строки C # на Python.Программа на C # использует пользовательскую .Net dll под названием foobar.dll, которая взаимодействует с некоторым лабораторным оборудованием через I2C.Использование dll в коде C # выглядит следующим образом:

fooBar.fooProvider provider = new foobar.fooProvider()
fooBar.fooBarLib fooLib = new foobar.fooBarLib(provider, 0x80)
# used below ...
numFloat = fooLib.GetSomething()
# more python ...
fooLib.SetSomething(NumberAsAFloat)

Я думал о простом использовании ctypes для доступа к dll, но я подумал, что это не сработает для C # /. Net.Из-за ограничений в нашей лаборатории мне нужно использовать модули дистрибутива + дополнения Python (т.е. не IronPython или CPython). Я смотрел на Python для .NET, но я не уверен, что это действительно сработает.Я n00b для .Net, но имею большой опыт работы с Java, C ++ и Python.Кто-нибудь сталкивался с этой ситуацией и хорошим решением раньше?

РЕДАКТИРОВАТЬ:

Имея объяснение снизу, я импортировал clr в интерпретатор Python, а затем попытался импортировать библиотеку fooBar сследующий результат:

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'Interop.AVMCIFCLib, Version=1.2.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
File name: 'Interop.AVMCIFCLib, Version=1.2.0.0, Culture=neutral, PublicKeyToken=null'
   at System.Signature._GetSignature(SignatureStruct& signature, Void* pCorSig, Int32 cCorSig, IntPtr fieldHandle, IntPtr methodHandle, IntPtr declaringTypeHandle)
   at System.Signature.GetSignature(SignatureStruct& signature, Void* pCorSig, Int32 cCorSig, RuntimeFieldHandle fieldHandle, RuntimeMethodHandle methodHandle, RuntimeTypeHandle declaringTypeHandle)
   at System.Signature..ctor(RuntimeMethodHandle methodHandle, RuntimeTypeHandledeclaringTypeHandle)
   at System.Reflection.RuntimeMethodInfo.get_Signature()
   at System.Reflection.RuntimeMethodInfo.FetchNonReturnParameters()
   at System.Reflection.RuntimeMethodInfo.GetParametersNoCopy()
   at System.Reflection.RuntimePropertyInfo.GetIndexParameters()
   at Python.Runtime.ClassManager.GetClassInfo(Type type)
   at Python.Runtime.ClassManager.CreateClass(Type type)
   at Python.Runtime.ClassManager.GetClass(Type type)
   at Python.Runtime.ModuleObject.GetAttribute(String name, Boolean guess)
   at Python.Runtime.ModuleObject.LoadNames()
   at Python.Runtime.ImportHook.__import__(IntPtr self, IntPtr args, IntPtr kw)

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].

И тогда происходит сбой интерпретатора.Это похоже на плохо построенную DLL, правильно?

1 Ответ

7 голосов
/ 26 апреля 2011

Python для .NET работает очень хорошо, и вы можете выполнять код .NET из Python. IronPython тоже хорошо работает, хотя и наоборот. Вы можете думать о Python для .NET как о расширении CPython, которое может выполнять код .NET, тогда как IronPython является расширением CLR, позволяющим выполнять код Python. Поскольку ваши потребности диктуют вам использовать ванильный Python, Python для .NET должен работать. И заметим, что ванильный дистрибутив Python в большинстве случаев CPython.

...