2017-12-24 13 views
0
Public Function GenerateScript(code As String) As IScript 
    Using provider As New VBCodeProvider() 
     Dim parameters As New CompilerParameters() 
     parameters.GenerateInMemory = True 
     parameters.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location) 
     Dim interfaceNamespace As String = GetType(IScript).Namespace 
     Dim codeArray() As String = New String() {"Imports " & interfaceNamespace & Environment.NewLine & code} 
     Dim results As CompilerResults = provider.CompileAssemblyFromSource(parameters, codeArray) 
     Return CType(results.CompiledAssembly.CreateInstance("Script"), IScript) 
    End Using 
End Function 

시간이 지나면 바뀔 수있는 문자열을 실행하려면 위 코드를 사용하고 있습니다. 그러나 이것을 실행할 때 다음 오류가 발생합니다.CodeDom 컴파일러가 DLL을 액세스하는 데 문제가 있습니다.

System.IO.FileNotFoundException: 'Could not load file or assembly 'file:///C:\Users\zjf\AppData\Local\Temp\ykujgxkp.dll' or one of its dependencies. The system cannot find the file specified.' 

잘 모르겠습니다. 누구든지 제발 도와 주실 수 있습니까?

감사합니다.

+0

'시스템이 지정된 파일을 찾을 수 없습니다. '- 파일이 없다는 것이 명백합니까? 그곳에 있다면 애플리케이션을 관리자로 실행하고 문제가 있는지 확인하는 것이 좋습니다. –

+0

관리자와 함께 실행하면 동일한 일이 발생합니다. – zjf

답변

0

당신은 당신이 당신의 응용 프로그램에 dll 파일을 구현해야 할 부분을 놓치고, 코드에 이것을 추가하려고 :

Public Function GenerateScript(code As String) As IScript 
    Using provider As New VBCodeProvider() 
     Dim parameters As New CompilerParameters() 
     parameters.GenerateInMemory = True 
     Parameters.EmbeddedResources.Add("C:\Users\zjf\AppData\Local\Temp\ykujgxkp.dll") 
     Parameters.ReferencedAssemblies.AddRange(New String() {"System.dll", "System.Drawing.dll", "System.Windows.Forms.dll", "System.Management.dll", "C:\Users\zjf\AppData\Local\Temp\ykujgxkp.dll"}) 
     Dim interfaceNamespace As String = GetType(IScript).Namespace 
     Dim codeArray() As String = New String() {"Imports " & interfaceNamespace & Environment.NewLine & code} 
     Dim results As CompilerResults = provider.CompileAssemblyFromSource(parameters, codeArray) 
     Return CType(results.CompiledAssembly.CreateInstance("Script"), IScript) 
    End Using 
End Function 
:

Parameters.EmbeddedResources.Add("C:\Users\zjf\AppData\Local\Temp\ykujgxkp.dll") 
Parameters.ReferencedAssemblies.AddRange(New String() {"System.dll", "System.Drawing.dll", "System.Windows.Forms.dll", "System.Management.dll", "C:\Users\zjf\AppData\Local\Temp\ykujgxkp.dll"}) 

그래서 최종 코드는 다음과 같이해야한다

+0

사실 가져온 것이 아니기 때문이 아닙니다. 코드를 실행할 때마다 dll의 이름이 변경되므로 가져올 수 없습니다. 나는 dll이 일시적인 dll이고 정적 인 것이 아니라고 생각한다. 또한 dll이나 유사한 dll은 temp 폴더에서 찾을 수 없습니다. – zjf

+0

누구나 답변을 가지고 있습니까? – zjf