Context
Voor een webservertje wat ik aan het maken ben gebruik ik een soort CGI pagina's. Deze CGI pagina's zijn C# codefiles, welke in-memory worden gecompiled. Hierna word er een vaste methode (CGI.Get()) aangeroepen in de codefile.
Dit werkt allemaal goed naar behoren en ook snel.
Nu ben ik in een situatie waarbij ik een 3th party libary wil includen, zodat ik (in dit geval) grafiekjes kan tekenen in mijn HTML pagina's.
Dit gaat niet helemaal goed
Probleem
Ik include mijn assemblies met de volgende code:
Dit werkt goed voor native .NET libraries (System.Xml.dll) etc.
Het vreemde is dat de libraries wel lijken te worden geinclude. Als ik een 'using xxxx' gebruik in mijn code, en de dll express niet inlaad, dan krijg ik daar netjes een melding over. Als ik de dll dan wel inlaad, verdwijnt deze foutmelding. So far, so good. Enkel, zodra ik een class wil instantieren uit deze libary / of een methode wil aanroepen, dan krijg ik een foutmelding:
En met deze foutmelding kom ik niet verder.
Heeft iemand een idee waarom dit niet goed gaat?
edit:
Ik heb in mijn CGI pagina een try/catch block gezet waar eventuele foutmeldingen in de HTML pagina gezet worden. Deze Exceptie word niet gegooid binnen mijn CGI pagina, maar tijdens het uitvoeren van de CGI.Get() methode. Dit met de volgende code:
Voor een webservertje wat ik aan het maken ben gebruik ik een soort CGI pagina's. Deze CGI pagina's zijn C# codefiles, welke in-memory worden gecompiled. Hierna word er een vaste methode (CGI.Get()) aangeroepen in de codefile.
Dit werkt allemaal goed naar behoren en ook snel.
Nu ben ik in een situatie waarbij ik een 3th party libary wil includen, zodat ik (in dit geval) grafiekjes kan tekenen in mijn HTML pagina's.
Dit gaat niet helemaal goed
Probleem
Ik include mijn assemblies met de volgende code:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| CodeProvider = new CSharpCodeProvider(); CSharpCompilerParameters = new CompilerParameters(); DirectoryInfo IncludeDir = new DirectoryInfo("www\\data\\include"); foreach (FileInfo IncludeFile in IncludeDir.GetFiles()) { if (IncludeFile.Extension == ".dll") { CSharpCompilerParameters.ReferencedAssemblies.Add(IncludeFile.FullName); } } CSharpCompilerParameters.ReferencedAssemblies.Add("System.dll"); CSharpCompilerParameters.ReferencedAssemblies.Add("System.XML.dll"); CSharpCompilerParameters.ReferencedAssemblies.Add("System.Drawing.dll"); //Create parameters that we later pass on the the compiler (outputfile is null since we create the assembly in-memory) //We do not want an executable (we want a libary), and we want to create this in-memory CSharpCompilerParameters.GenerateExecutable = false; CSharpCompilerParameters.GenerateInMemory = true; //Compile the actual assembly CSharpCompilerResults = CodeProvider.CompileAssemblyFromFile(CSharpCompilerParameters, this.Path); if (CSharpCompilerResults.Errors.HasErrors) throw new CompilerException(CSharpCompilerResults.Errors); //The resulting Assembly object is placed in the CompilerResults CompiledAssembly = CSharpCompilerResults.CompiledAssembly; |
Dit werkt goed voor native .NET libraries (System.Xml.dll) etc.
Het vreemde is dat de libraries wel lijken te worden geinclude. Als ik een 'using xxxx' gebruik in mijn code, en de dll express niet inlaad, dan krijg ik daar netjes een melding over. Als ik de dll dan wel inlaad, verdwijnt deze foutmelding. So far, so good. Enkel, zodra ik een class wil instantieren uit deze libary / of een methode wil aanroepen, dan krijg ik een foutmelding:
code:
1
| Exception has been thrown by the target of an invocation. mscorlib at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) at WebServer.CodeCompiler.RunMethod(String ClassName, String MethodName, Object[] Parameters) in C:\Documents and Settings\A110471\My Documents\Visual Studio 2008\Projects\PimsLogService\PimsLogService\CodeCompiler.cs:line 41 at WebServer.Sender.HandleRequest(HTTPRequest Request) in C:\Documents and Settings\A110471\My Documents\Visual Studio 2008\Projects\PimsLogService\PimsLogService\HTTPSender.cs:line 45 |
En met deze foutmelding kom ik niet verder.
Heeft iemand een idee waarom dit niet goed gaat?
edit:
Ik heb in mijn CGI pagina een try/catch block gezet waar eventuele foutmeldingen in de HTML pagina gezet worden. Deze Exceptie word niet gegooid binnen mijn CGI pagina, maar tijdens het uitvoeren van de CGI.Get() methode. Dit met de volgende code:
C#:
1
2
3
4
5
6
7
8
9
10
11
| public object RunMethod(string ClassName, string MethodName, object[] Parameters) { //Get the type (class) Type RunType = CompiledAssembly.GetType(ClassName); //Get the method MethodInfo RunMethod = RunType.GetMethod(MethodName); //Create an instance of the type (class) Object Obj = Activator.CreateInstance(RunType); //return the object that was created by the called Method (Parameters is an array of objects that we pass on to the called function) return RunMethod.Invoke(Obj, new object[] { Parameters } ); } |
[ Voor 9% gewijzigd door Verwijderd op 05-11-2007 13:16 ]