0

我正在尝试序列化动态生成/编译的程序集以存储到 SQL 中,然后提取程序集以供使用。但是,我遇到了一个让我发疯的错误。

"无法加载文件或程序集 '<random code>,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null' 或其依赖项之一。系统找不到指定的文件。 "

当我尝试对程序集进行反序列化时。将不胜感激任何指针。部分代码:

    '--------------------------------------------------------------
    'This section SUCCESSFULLY Compile & Execute the Dynamic Code
    '  vsResult returns ok.
    '  **Note: This is partial code to create the compiler.
    '--------------------------------------------------------------
    Dim voCompileResults As System.CodeDom.Compiler.CompilerResults = voCompiler.CompileAssemblyFromSource(voCompilerParams, sb.ToString)
    Dim voAssembly As Reflection.Assembly = voCompileResults.CompiledAssembly
    Dim voInstance As Object = Activator.CreateInstance(voAssembly.GetType("libARules.clsMyRoutine"), {New libARules.Sys.clsInterProcessData(New System.Xml.XmlDocument), New libArrowOps.clsDBAccess})
    Dim vsResult As String = voInstance.GetType().InvokeMember("Run", Reflection.BindingFlags.InvokeMethod, Nothing, voInstance, Nothing)

    '----------------------------------------------------
    'Attempt to Serialize the Assembly for store/forward
    '----------------------------------------------------
    Dim voMemStream As New IO.MemoryStream
    Dim voBF As New Runtime.Serialization.Formatters.Binary.BinaryFormatter
    voBF.AssemblyFormat = Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple
    voBF.Serialize(voMemStream, voCompileResults.CompiledAssembly)

    '--------------------------------------
    'Reset the MemoryStream position to begining
    '--------------------------------------
    voMemStream.Position = 0

    '--------------------------------------
    'Attempt to De-Serialize the MemoryStream back to an assembly
    '--------------------------------------
    voBF = New Runtime.Serialization.Formatters.Binary.BinaryFormatter
    voBF.AssemblyFormat = Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple
    voAssembly = voBF.Deserialize(voMemStream)
    '----- **Error Here** ---------------------------------

ERROR 此时:在线voAssembly = voBF.Deserialize(voMemStream)

无法加载文件或程序集 '...<random code>..., Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' 或其依赖项之一。系统找不到指定的文件

4

1 回答 1

1

好吧,我终于在小睡后想通了......在这里为“后代”记录它:P

显然,我不应该对 CompiledAssembly 进行序列化/反序列化。

    '-----------------------------------------------------
    'Instead of Generating in Memory, generate it into a temporary Assembly file (I don't need the CompiledAssembly from the compiler).
    ' Note: Again, this is partial code, with only the important parts here.
    '-----------------------------------------------------
    voCompilerParams.ReferencedAssemblies.Add("mscorlib.dll")
    voCompilerParams.GenerateInMemory = False
    voCompilerParams.OutputAssembly = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "deleteNow_" & Guid.NewGuid().ToString() & ".dll")

    Dim voCompileResults As System.CodeDom.Compiler.CompilerResults = voCompiler.CompileAssemblyFromSource(voCompilerParams, sb.ToString)

    '--------------------------------------------------------------------------
    'After the Assembly is generated, open the Assembly file and read the entire content into a byte buffer.
    'Note that this byte buffer **CAN BE STORED into an SQL BLOB field.**
    '--------------------------------------------------------------------------
    Dim voInstance As Object = Nothing
    Dim vsResult As String = ""
    Dim voAssembly As Reflection.Assembly = Nothing
    If Not voCompileResults.Errors.HasErrors Then
        '----------------------------------------------------------------
        'No compilation error, open and read the generated assembly file
        '  into a Byte array.
        '----------------------------------------------------------------
        Dim voBuffer() As Byte = Nothing
        Dim voFileStream As IO.FileStream = IO.File.OpenRead(voCompilerParams.OutputAssembly)
        If voFileStream.CanRead Then
            ReDim voBuffer(voFileStream.Length - 1)
            voFileStream.Read(voBuffer, 0, voFileStream.Length)
        End If
        voFileStream.Close()
        IO.File.Delete(voCompilerParams.OutputAssembly) 'Clean-up after ourselves.

        '----------------------------------------------------------------
        'Now, re-create the CompiledAssembly from the Byte array.
        '----------------------------------------------------------------
        If Not IsNothing(voBuffer) Then
            voAssembly = Reflection.Assembly.Load(voBuffer)
        End If
        If Not IsNothing(voAssembly) Then
            '--------------------------------------------
            'Instantiate my dynamically compiled class
            '--------------------------------------------
            voInstance = Activator.CreateInstance(voAssembly.GetType("libARules.clsMyRoutine"), {New libARules.Sys.clsInterProcessData(New System.Xml.XmlDocument), New libMyLib.clsMyClass})
            If Not IsNothing(voInstance) Then
               '------------------------------------------------
               'Run my dynamic code to proof that it is working
               '------------------------------------------------
                vsResult = voInstance.GetType().InvokeMember("Run", Reflection.BindingFlags.InvokeMethod, Nothing, voInstance, Nothing)
            End If
        End If
    End If

而且...vsResult人口众多。这是一个概念证明,CompiledAssembly可以在以后存储和重用。注意,在voAssemblyvoBuffer().

于 2012-12-28T08:13:25.957 回答