У меня 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);
}
}
}