Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C#] Problemen met CodeDom/CSharpCompiler assembly reference

Pagina: 1
Acties:

Verwijderd

Topicstarter
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:

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 ]


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Check even de InnerException van de TargetInvocationException om te kijken wat er daarbinnen fout gaat.

Nu met Land Rover Series 3 en Defender 90


Verwijderd

Topicstarter
MTWZZ schreef op maandag 05 november 2007 @ 13:39:
Check even de InnerException van de TargetInvocationException om te kijken wat er daarbinnen fout gaat.
Bedankt. De InnerException is deze:
code:
1
Could not load file or assembly 'ZedGraph, Version=5.0.9.18610, Culture=neutral, PublicKeyToken=02a83cbd123fcd60' or one of its dependencies. The system cannot find the file specified. at CGI.CGI.GET(Object[] Parameters)


Ik heb het path naar de dll gechecked. Deze is ok.

Ik heb alle dependencies van de dll toegevoegd aan het lijstje van toe te voegen dll's aan CompilerParameters. Ik krijg hierna nog steeds dezelfde melding

[ Voor 17% gewijzigd door Verwijderd op 05-11-2007 14:00 ]


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Wat je even kunt proberen is op het AppDomain waarbinnen je de "CGI" pagina laad het AssemblyResolve event koppelen en handlen.
Binnen dit event kun je handmatig een assembly laden met bijvoorbeeld Assembly.LoadFile.
Wat het framework je namelijk wil vertellen is dat ie in de zoeklocaties die bij hem bekend zijn de betreffende assembly niet kan vinden.

Nu met Land Rover Series 3 en Defender 90


Verwijderd

Topicstarter
MTWZZ schreef op maandag 05 november 2007 @ 15:46:
Wat je even kunt proberen is op het AppDomain waarbinnen je de "CGI" pagina laad het AssemblyResolve event koppelen en handlen.
Binnen dit event kun je handmatig een assembly laden met bijvoorbeeld Assembly.LoadFile.
Wat het framework je namelijk wil vertellen is dat ie in de zoeklocaties die bij hem bekend zijn de betreffende assembly niet kan vinden.
Dit terwijl ik bij de reference assemblies het volledige path naar de dll opgeef?

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Als ik het goed zie is dat bij compile-time en niet run-time.

Edit:
Wilde gok: kan het eventueel een rechten probleem zijn?

[ Voor 35% gewijzigd door MTWZZ op 05-11-2007 21:56 ]

Nu met Land Rover Series 3 en Defender 90


Verwijderd

Topicstarter
MTWZZ schreef op maandag 05 november 2007 @ 21:55:
Als ik het goed zie is dat bij compile-time en niet run-time.

Edit:
Wilde gok: kan het eventueel een rechten probleem zijn?
Volgens mij is het tijdens runtime

Rechten probleem? Bedoel je dat op file access niveau?
Pagina: 1