Проблемы со встраиванием IronPython в C # (Отсутствует обязательный член компилятора Microsoft.CSharp.RuntimeBinder.Binder.InvokeMember.

Я пытаюсь создать простой приветственный мир, чтобы проверить встраивание IronPython в C #, но, похоже, не могу решить эту проблему.

Это мой файл C #;

using System;
using IronPython.Hosting;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
using System.IO;

public class dynamic_demo
{
    static void Main()
    {
        var ipy = Python.CreateRuntime();

        dynamic test = ipy.UseFile(@"../../Test.py");

        test.Simple();
    }
}

А это класс питона;

import sys

def Simple():
    print 'Hello from Python'
    print "Call Dir(): "
    print dir()
    print "Print the Path: " 
    print sys.path

Моя целевая платформа .NET - 4.0, и я использую IronPython 2.6 ..

Я получаю 2 ошибки при запуске, эта из файла с именем «CSC»; Ошибка 5 Отсутствует обязательный член компилятора

'Microsoft.CSharp.RuntimeBinder.Binder.InvokeMember' C: \ Users \ Tolga \ documents \ Visual Studio 2012 \ Projects \ WindowsFormsApplication1 \ consoleTest \ CSC consoleTest

Другой - из файла C #, который я создал

Ошибка 6 Не удалось найти один или несколько типов, необходимых для компиляции динамического выражения. Вам не хватает ссылки? C: \ Users \ Tolga \ documents \ Visual Studio 2012 \ Projects \ WindowsFormsApplication1 \ consoleTest \ Program.cs 17 9 consoleTest

Вот результат сборки

1>------ Build started: Project: consoleTest, Configuration: Debug Any CPU ------
1>CSC : warning CS1685: The predefined type 'System.Runtime.CompilerServices.CallSite' is defined in multiple assemblies in the global alias; using definition from 'c:\Program Files (x86)\IronPython 2.6\Microsoft.Scripting.Core.dll'
1>CSC : warning CS1685: The predefined type 'System.Runtime.CompilerServices.CallSite' is defined in multiple assemblies in the global alias; using definition from 'c:\Program Files (x86)\IronPython 2.6\Microsoft.Scripting.Core.dll'
1>CSC : warning CS1685: The predefined type 'System.Runtime.CompilerServices.CallSiteBinder' is defined in multiple assemblies in the global alias; using definition from 'c:\Program Files (x86)\IronPython 2.6\Microsoft.Scripting.Core.dll'
1>CSC : warning CS1685: The predefined type 'System.Runtime.CompilerServices.ExtensionAttribute' is defined in multiple assemblies in the global alias; using definition from 'c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll'
1>CSC : error CS0656: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.Binder.InvokeMember'
1>C:\Users\Tolga\documents\visual studio 2012\Projects\WindowsFormsApplication1\consoleTest\Program.cs(17,9,17,20): error CS1969: One or more types required to compile a dynamic expression cannot be found. Are you missing a reference?
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

person Tolga E    schedule 01.10.2012    source источник


Ответы (3)


Вам нужно добавить ссылку на Microsoft.CSharp.dll. Это обеспечивает необходимые типы для использования dynamic в C #.

Кроме того, вам, вероятно, потребуется выполнить обновление до IronPython 2.7 [.3] или более поздней версии, поскольку есть некоторые несовместимости со старыми выпусками и новыми платформами .NET.

person Reed Copsey    schedule 01.10.2012
comment
Когда я нажимаю ссылки в моем проекте, я вижу Microsoft.CSharp в списке - person Tolga E; 01.10.2012
comment
@TolgaE Если вы компилируете из командной строки, я бы рекомендовал использовать MSBuild с проектом, так как он получит ссылки. Если вы используете CSC, вам нужно указать ссылки самостоятельно (он не будет читать из файла проекта). - person Reed Copsey; 01.10.2012
comment
@ToglaE В противном случае просто создайте его внутри Visual Studio, и он должен работать (поскольку эта ссылка существует) - person Reed Copsey; 01.10.2012
comment
Я создаю его в Visual Studio. Я просто нажал кнопку Пуск - person Tolga E; 01.10.2012
comment
@ToglaE Убедитесь, что вы нацеливаете .NET 4.5 или .NET 4.0 Full (не на профиль клиента) в настройках сборки. Это поможет? - person Reed Copsey; 01.10.2012
comment
спасибо за предложения, но он установлен на 4.0. Я тоже пробовал с 4.5 - person Tolga E; 01.10.2012
comment
Я добавил результат сборки в вопрос, на случай, если это поможет - person Tolga E; 01.10.2012
comment
@TolgaE Я считаю, что вам может потребоваться обновление до последней версии IronPython (2.7.3), поскольку, вероятно, есть некоторые несовместимости с 2.6 и последней версией. - person Reed Copsey; 01.10.2012
comment
Ура !!! Это сработало (я понизил версию до 2.6 раньше из-за другой проблемы, которая сейчас не актуальна. Спасибо! - person Tolga E; 01.10.2012
comment
Я получаю ту же ошибку компилятора (отсутствует обязательный член компилятора) при запуске IronPython 2.7.4 и таргетинге на полный профиль .NET 4.0. - person cod3monk3y; 10.12.2013
comment
Решил мою проблему. Поскольку он решает другой аспект, чем этот ответ, я добавил дополнительный ответ и связался с вопросом, который помог решить мою проблему. - person cod3monk3y; 10.12.2013
comment
FWIW добавление Microsoft.CSharp.dll означает var scriptOptions = ScriptOptions.Default.WithReferences (Microsoft.CSharp), то есть удаление dll. Поставил меня в тупик на несколько минут :) - person Jon H; 06.04.2016

Вы также получите эту ошибку, если включили ссылки на неправильные целевые сборки. Например, если вы строите с использованием профиля .Net 4.0 Full, вы должны включить сборки IronPython из:

<install directory>\IronPython 2.7\Platforms\Net40

Включение сборок из каталога Net35 также приведет к ошибке отсутствия RuntimeBinder.

person cod3monk3y    schedule 10.12.2013

Очень старый вопрос по все еще существующей проблеме, с которой я столкнулся сегодня утром, используя IronPython 2.7.10 в новом проекте.

Принятый ответ теперь можно улучшить: вместо того, чтобы вручную добавлять Microsoft.CSharp.dll, я бы рекомендовал добавить пакет «Microsoft.CSharp» из nuget. Будет улучшена переносимость (netstandard, net framework, netcore ...).

person Tok'    schedule 05.05.2020