3

次のコンソール アプリケーションを検討してください。

using System;
using System.IO;
using System.Text;
using System.Xml.Serialization;
using System.Reflection.Emit;
using System.Reflection;
using Roslyn.Scripting.CSharp;

class Program
{
    static void Main(string[] args)
    {
        var dynAssembly = AssemblyBuilder
            .DefineDynamicAssembly(
            new AssemblyName("TestAssembly"),
            AssemblyBuilderAccess.RunAndSave);
        var dynModule = dynAssembly.DefineDynamicModule("TestModule");
        var typeBuilder = dynModule.DefineType("Test", TypeAttributes.Public);
        var dynamicType = typeBuilder.CreateType();
        var serializer = new XmlSerializer(dynamicType);
        var sBuilder = new StringBuilder();
        serializer.Serialize(
            new StringWriter(sBuilder),
            Activator.CreateInstance(dynamicType));
        Console.WriteLine(sBuilder.ToString());

        var engine = new ScriptEngine();
        engine.AddReference(Type.GetType("System.Object").Assembly.Location);
        engine.ImportNamespace("System");
        var roslynType = engine
            .CreateSession()
            .Execute<Type>("public class Test{public Test(){}};typeof(Test)");
        serializer = new XmlSerializer(roslynType); // FileNotFoundException
    }
}

をインスタンス化してas 引数XmlSerializerを渡すと、次の実行時例外が発生します。roslynType

ファイルまたはアセンブリ 'ℛ*875699ae-0282-43b7-8ca3-a2f223a3d567-#1UD.XmlSerializers' またはその依存関係の 1 つを読み込めませんでした。ファイル名、ディレクトリ名、またはボリューム ラベルの構文が正しくありません。

FusionLog には次のように表示されます。

=== Pre-bind state information ===
LOG: User = ***
LOG: DisplayName = ℛ*12d7c994-3636-4081-93d3-6bfe43cc8988-#1UD.XmlSerializers
 (Partial)
WRN: Partial binding information was supplied for an assembly:
WRN: Assembly Name: ℛ*12d7c994-3636-4081-93d3-6bfe43cc8988-#1UD.XmlSerializers | 
     Domain ID: 1
WRN: A partial bind occurs when only part of the assembly display name is provided.
WRN: This might result in the binder loading an incorrect assembly.
WRN: It is recommended to provide a fully specified textual identity for the 
     assembly,
WRN: that consists of the simple name, version, culture, and public key token.
WRN: See whitepaper http://go.microsoft.com/fwlink/?LinkId=109270 for more 
     information and common solutions to this issue.
LOG: Appbase = ***
LOG: Initial PrivatePath = NULL
Calling assembly : System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: ***
LOG: Using host configuration file: 
LOG: Using machine configuration file from 
     C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, 
     or location-based assembly bind).
LOG: Attempting download of new URL 
     file:///c:/users/userName/documents/visual studio 2012/
     Projects/ConsoleApplication147/ConsoleApplication147/bin/Debug/
     ℛ*12d7c994-3636-4081-93d3-6bfe43cc8988-#1UD.XmlSerializers.DLL.
ERR: A fatal error occurred when retrieving next codebase for download (hr = 0x8007007b).

のインスタンスをシリアル化することは可能roslynTypeですか? もしそうなら、私が見逃している手順は何ですか? まったく異なるアプローチはありますか?

4

1 に答える 1

1

この問題に直面しています。

そのページの他の回答の1つは、次を使用してインスタンス化することを提案していますXmlSerializer

var serializer = XmlSerializer.FromTypes(new[] { typeof(MyType) })[0];
于 2013-06-13T10:34:18.607 に答える