Возникли проблемы с импортом интерфейса С# в Python

Сегодня я много искал и читал, но так и не понял, как правильно что-то реализовать или даже определить, возможно ли это.

Вот суть того, что я пытаюсь сделать прямо сейчас. У меня есть приложение, которое загружает плагины через MEF. Плагины могут реализовывать различные интерфейсы, и, скажем, у меня есть один, который называется IDevice. У меня была эта дурацкая идея, что, возможно, пользователь захочет написать свой собственный плагин для устройств на IronPython, и его IronPython просто должен будет наследоваться от IDevice и реализовать необходимые методы.

Теперь я знаю, что можно реализовать интерфейс в IronPython, определив такой класс:

class MyDevice(IDevice):
  pass

Но я не могу решить первую проблему - как правильно импортировать интерфейс?

Интерфейс IDevice определяется в отдельной сборке с именем MyInterfaces.dll следующим образом:

namespace Company.Shared.MyInterfaces
{
    public interface IDevice
    {
        string GetName();
    }
}

Я пробовал import MyInterfaces, так как это наиболее логично, но это не сработало. Я также пробовал много менее логичных комбинаций imports и froms. Я всегда получаю следующую ошибку:

ImportException occurred
No module named MyInterfaces

Я загрузил Process Monitor, чтобы увидеть, что мое приложение пыталось загрузить, когда я выполнял свой скрипт, и оно пыталось загрузить файл с именем MyInterfaces, а затем попыталось загрузить MyInterfaces.py. Что ж, файл называется MyInterfaces*.dll*, ​​поэтому я изменил свой оператор импорта на чтение import MyInterfaces.dll, но это не имело никакого эффекта — мой код все равно просто пытался загрузить файл с именем MyInterfaces. Я подтвердил, что все мои зависимости находятся в нужной папке.

Я чувствую себя очень хромым из-за того, что не могу понять это, поэтому я надеюсь, что кто-то может указать мне правильное направление. Благодарю вас!


person Dave    schedule 10.11.2010    source источник


Ответы (1)


Я считаю, что правильным подходом будет:

import clr
clr.AddReference('MyInterfaces')

from Company.Shared.MyInterfaces import IDevice
person cdhowie    schedule 10.11.2010
comment
хм... Я видел, что это используется во многих примерах в книге, но это просто не щелкнуло для меня. Сейчас попробую, спасибо! - person Dave; 10.11.2010
comment
Нет проблем, надеюсь, это сработает... Я почти ничего не знаю о IronPython, но я злой гуглер. :) - person cdhowie; 10.11.2010
comment
cripes, я искал Google как сумасшедший, но не смог собрать все вместе. :'( Я не думаю, что в книге когда-либо говорилось, что вы должны импортировать clr в каждый сценарий, но теперь мне придется вернуться и перечитать ее! - person Dave; 10.11.2010
comment
Я не думаю, что вам нужно импортировать clr, но ничто другое не дает вам возможности объявлять ссылки на сборки. - person cdhowie; 10.11.2010