Сбой Powershell при попытке добавить тип из файла CS, который использует "System.Runtime.Serialization.Json" - PullRequest
0 голосов
/ 17 июня 2019

У меня Powershell 3.0 с .Net framework 4.0 на Windows 7 x64. Когда я пытаюсь использовать тип из файла C #, который использует System.Runtime.Serialization.Json.DataContractJsonSerializer, я постоянно получаю

"Add-Type: t: \ Powershell_Json_Test.cs (13): тип или пространство имен имя «Json» не существует в пространстве имен 'System.Runtime.Serialization' (отсутствует ссылка на сборку?) "

Ошибка появляется в строке

Add-Type -Path "$($MyPath)\Powershell_Json_Test.cs"

из Powershell_Json_Test.ps1. В то же время $ srs содержит объект System.Runtime.Serialization.Json.DataContractJsonSerializer (а также 400+ других объектов). То есть System.Runtime.Serialization.dll содержит System.Runtime.Serialization.Json.DataContractJsonSerializer, и он должен быть доступен для использования.

Кто-нибудь имеет представление, почему появляется ошибка?

Когда я пытаюсь использовать Powershell_Json_Test.cs из кода C #, все работает как положено.

Powershell_Json_Test.ps1

$MyPath = $(Split-Path -Path $MyInvocation.MyCommand.Path)
$srs = Add-Type -Assembly System.Runtime.Serialization -PassThru
Add-Type -Path "$($MyPath)\Powershell_Json_Test.cs"

$Hlpr = New-Object -TypeName "Test.Json.Helper"

$Obj = $Hlpr.GetInfo('{"Date":"2019-01-01","Result":2}')

Powershell_Json_Test.cs

using System;
using System.Text;
using System.IO;

namespace Test.Json
{
    public class Info
    {
        public string Date { get; set; }
        public int Result { get; set; }
    }

    public class Helper
    {
        public static string Serialize<T>(T obj)
        {
            var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());
            MemoryStream ms = new MemoryStream();
            serializer.WriteObject(ms, obj);
            string retVal = Encoding.UTF8.GetString(ms.ToArray());
            return retVal;
        }

        public static T Deserialize<T>(string json)
        {
            T obj = Activator.CreateInstance<T>();
            MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
            var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());
            obj = (T)serializer.ReadObject(ms);
            ms.Close();
            return obj;
        }

        public Info GetInfo(string JSON) {
            return Deserialize<Info>(JSON);
        }

    }

}

1 Ответ

0 голосов
/ 17 июня 2019

Только что нашел, как избежать ошибки.Мне пришлось использовать

Add-Type -Path "$($MyPath)\Powershell_Json_Test.cs" -ReferencedAssemblies System.Xml,System.Runtime.Serialization

вместо

Add-Type -Path "$($MyPath)\Powershell_Json_Test.cs"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...