diff --git a/LINQ/LINQ/Framewok/DynamicCode/vbc/DynamicCompiler.vb b/LINQ/LINQ/Framewok/DynamicCode/vbc/DynamicCompiler.vb
index 8d15efc..2e8aeb4 100644
--- a/LINQ/LINQ/Framewok/DynamicCode/vbc/DynamicCompiler.vb
+++ b/LINQ/LINQ/Framewok/DynamicCode/vbc/DynamicCompiler.vb
@@ -1,8 +1,11 @@
Imports System.Text
Imports System.CodeDom.Compiler
-Imports Microsoft.VisualBasic.Linq.Statements
Imports System.CodeDom
+Imports Microsoft.VisualBasic.Linq.Statements
Imports Microsoft.VisualBasic.CodeDOM_VBC
+Imports Microsoft.VisualBasic.Linq.Framework.Provider
+Imports Microsoft.VisualBasic.Linq.Framework.Provider.ImportsAPI
+Imports System.Reflection
Namespace Framework.DynamicCode.VBC
@@ -10,49 +13,55 @@ Namespace Framework.DynamicCode.VBC
''' 编译整个LINQ语句的动态代码编译器
'''
'''
- Public Class DynamicCompiler : Implements System.IDisposable
+ Public Class DynamicCompiler : Implements IDisposable
- '''
- '''
- '''
- '''
- Dim DotNETReferenceAssembliesDir As String
- Dim LINQStatement As LINQStatement
+ Public ReadOnly Property EntityProvider As TypeRegistry
+ Public ReadOnly Property ApiProvider As APIProvider
- Public Const ModuleName As String = "ILINQProgram"
- Public Const SetObjectName As String = "SetObject"
+ Sub New(entity As TypeRegistry, api As APIProvider)
+ ApiProvider = api
+ EntityProvider = entity
+ End Sub
- Dim ObjectModel As CodeNamespace
+ Sub New()
+ Call Me.New(TypeRegistry.LoadDefault, APIProvider.LoadDefault)
+ End Sub
- Public ReadOnly Property CompiledCode As String
- Get
- Return GenerateCode(ObjectModel)
- End Get
- End Property
+ Public ReadOnly Property ImportsNamespace As List(Of String) = New List(Of String)
+ Public ReadOnly Property ReferenceList As New List(Of String)
- '''
- '''
- '''
- '''
- ''' .NET Framework Reference Assembly文件夹的位置
- '''
- Sub New(LINQStatement As LINQStatement, SDK As String)
- Me.LINQStatement = LINQStatement
- Me.DotNETReferenceAssembliesDir = SDK
+ Public Sub [Imports](ns As String)
+ Dim types As Type() = ApiProvider.GetType(ns)
+ For Each nsDef As Type In types
+ Dim name As String = nsDef.FullName
+ If Not ImportsNamespace.Contains(name) Then
+ Call ImportsNamespace.Add(name)
+ End If
+ Dim assm As String = nsDef.Assembly.Location
+ If Not ReferenceList.Contains(assm) Then
+ Call ReferenceList.Add(assm)
+ End If
+ Next
End Sub
- Public Function DeclareAssembly() As CodeDom.CodeCompileUnit
+ Public Function Compile([declare] As CodeTypeDeclaration) As Type
+ Dim assmUnit As CodeCompileUnit = DeclareAssembly()
+ Dim ns As CodeNamespace = assmUnit.Namespaces.Item(0)
+ Call ns.Types.Add([declare])
+ Call ns.Imports.AddRange(Me.ImportsNamespace.ImportsNamespace)
+ Dim assm As Assembly = CompileDll(assmUnit, ReferenceList, EntityProvider.SDK)
+ Dim types As Type() = assm.GetTypes
+ Dim name As String = [declare].Name
+ Dim LQuery = (From x As Type In types
+ Where String.Equals(x.Name, name)
+ Select x).FirstOrDefault
+ Return LQuery
+ End Function
+
+ Public Shared Function DeclareAssembly() As CodeCompileUnit
Dim Assembly As CodeDom.CodeCompileUnit = New CodeDom.CodeCompileUnit
Dim DynamicCodeNameSpace As CodeDom.CodeNamespace = New CodeDom.CodeNamespace("LINQDynamicCodeCompiled")
Assembly.Namespaces.Add(DynamicCodeNameSpace)
-
- DynamicCodeNameSpace.Types.Add(DeclareType)
- DynamicCodeNameSpace.Imports.AddRange(New String() {}.ImportsNamespace)
-#If DEBUG Then
- Console.WriteLine(GenerateCode(DynamicCodeNameSpace))
-#End If
- ObjectModel = DynamicCodeNameSpace
-
Return Assembly
End Function
diff --git a/LINQ/LINQ/Framewok/Provider/ImportsAPI/APIProvider.vb b/LINQ/LINQ/Framewok/Provider/ImportsAPI/APIProvider.vb
index 271b524..e46b9fd 100644
--- a/LINQ/LINQ/Framewok/Provider/ImportsAPI/APIProvider.vb
+++ b/LINQ/LINQ/Framewok/Provider/ImportsAPI/APIProvider.vb
@@ -33,6 +33,19 @@ Namespace Framework.Provider.ImportsAPI
Public Shared ReadOnly Property DefaultFile As String =
App.ProductSharedDIR & "/API.Imports.json"
+ '''
+ ''' 命名空间的大小写不敏感
+ '''
+ '''
+ '''
+ Public Overloads Function [GetType](ns As String) As Type()
+ If __nsList.ContainsKey(ns.ToLower.ShadowCopy(ns)) Then
+ Return __nsList(ns).Modules.ToArray(Function(x) x.GetType)
+ Else
+ Return New Type() {}
+ End If
+ End Function
+
Public Function Register(assm As Assembly) As Boolean
Dim types As Type() = assm.GetTypes
Dim LQuery = (From type As Type In types
@@ -70,6 +83,10 @@ Namespace Framework.Provider.ImportsAPI
Return Save(Path, encoding.GetEncodings)
End Function
+ Public Shared Function LoadDefault() As APIProvider
+ Return LoadJsonFile(Of APIProvider)(DefaultFile)
+ End Function
+
Sub Save()
Call Save(DefaultFile, Encodings.ASCII)
End Sub
diff --git a/LINQ/LINQ/Framewok/Provider/Registry/TypeRegistry.vb b/LINQ/LINQ/Framewok/Provider/Registry/TypeRegistry.vb
index ef5cfd8..ed853cb 100644
--- a/LINQ/LINQ/Framewok/Provider/Registry/TypeRegistry.vb
+++ b/LINQ/LINQ/Framewok/Provider/Registry/TypeRegistry.vb
@@ -27,6 +27,12 @@ Namespace Framework.Provider
End Set
End Property
+ '''
+ ''' .NET SDK directory
+ '''
+ '''
+ Public Property SDK As String
+
Dim _typeHash As Dictionary(Of String, TypeEntry)
'''
diff --git a/LINQ/LINQ/LDM/Expression/WhereClosure.vb b/LINQ/LINQ/LDM/Expression/WhereClosure.vb
index 208ea72..adc91d8 100644
--- a/LINQ/LINQ/LDM/Expression/WhereClosure.vb
+++ b/LINQ/LINQ/LDM/Expression/WhereClosure.vb
@@ -64,6 +64,12 @@ Namespace LDM.Expression
Return [Function]
End Function
+ Public Function BuildModule() As CodeTypeDeclaration
+ Dim type As New CodeTypeDeclaration(NameOf(WhereClosure))
+ Call type.Members.Add(__buildFunc)
+ Return type
+ End Function
+
Sub New(expr As Token(Of Tokens)(), type As Type)
Call MyBase.New(New Statements.Tokens.WhereClosure(expr))
End Sub