|
|
发表于 2006-7-2 21:16:00
|
显示全部楼层
Re:如何在游戏中使用LUA的脚本
主要代码就是下面这个部分:
#Region "脚本对象基类"
Public MustInherit Class ScriptObject
Public Sub New()
End Sub
Public Function GetClass(ByVal ClassName As String, ByVal asm As Reflection.Assembly) As Type
Dim aa() As Reflection.Module
'aa = asm.EntryPoint()
aa = asm.GetLoadedModules()
Return aa(0).GetType(ClassName)
End Function
Public Function LoadFunction(ByVal AsmType As Type, ByVal FunctionName As String, ByVal FunctionType As Type) As System.Delegate
Dim bb As Reflection.MethodInfo
bb = AsmType.GetMethod(FunctionName, BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.Static)
Return System.Delegate.CreateDelegate(FunctionType, bb)
End Function
End Class
#End Region
Public Class Script
'Private AsmPlayer As Reflection.Assembly
Public Shared Function LoadScript(ByVal Path As String) As [Assembly]
Dim vbp As CodeDom.Compiler.CodeDomProvider
'Dim cp As CodeDom.Compiler.CodeDomProvider = New Microsoft.CSharp.CSharpCodeProvider
Dim files() As String
Dim m_params = New CodeDom.Compiler.CompilerParameters
m_params.GenerateInMemory = True
m_params.GenerateExecutable = False
m_params.CompilerOptions = "/target:library /optimize"
m_params.WarningLevel = 4
m_params.ReferencedAssemblies.Add("System.dll")
m_params.ReferencedAssemblies.Add("Common.dll")
m_params.ReferencedAssemblies.Add("CeguiDotNet.dll")
m_params.ReferencedAssemblies.Add("OgreDotNet.dll")
m_params.ReferencedAssemblies.Add("OgreDotNet.Cegui.dll")
m_params.ReferencedAssemblies.Add("Math3D.dll")
Try
files = IO.Directory.GetFiles(Path)
Catch ex As Exception
MsgBox(Path & "目录不存在!")
Return Nothing
End Try
If files.Length = 0 Then
MsgBox(Path & "目录下缺少脚本文件!")
Return Nothing
End If
If files(0).Substring(files(0).Length - 1, 1).ToLower = "b" Then vbp = New Microsoft.VisualBasic.VBCodeProvider Else vbp = New Microsoft.CSharp.CSharpCodeProvider
Dim com As CodeDom.Compiler.ICodeCompiler = vbp.CreateCompiler
Dim res As CodeDom.Compiler.CompilerResults = com.CompileAssemblyFromFileBatch(m_params, files)
If res.Errors.Count <> 0 Then
Dim i As Int16
For i = 1 To res.Errors.Count
MsgBox("出错:" & res.Errors(i - 1).FileName & "的第" & res.Errors(i - 1).Line _
& "行 错误描述:" & res.Errors(i - 1).ErrorText)
Next i
Return Nothing
End If
Return res.CompiledAssembly
End Function
End Class |
|