dynamicka kompilace   otázka

C#

Zdravim, mám aplikaci která umožňuje po spuštění dynamicky vytvářet příkazy linq do databáze. Problém je v tom že nemůžu vytvařit instanci třídy DataClassesNorthwinDataContext v dynamicky vytvářené třídě Driver. Pořád mi to píše chybu byl očekáván typ. Myslím si že jsem něco přehlídl ale nemožu přijít na to co. Mockrát děkuji za radu.

čast kodu:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.IO;
 
 
namespace linqtosql
{
    class CodeDriver: MarshalByRefObject
    {
         
 
        private string prefix =
            "using System; " +
            "using System.Text;" +
            "using System.Collections.Generic;"+
            "using linqtosql;"+
 
 
              "public static class Driver:" +
                "{" +
 
                   "public static void Run()" +
                     "{"+
 
                     "DataClassesNorthwinDataContext db = new DataClassesNorthwinDataContext();"
                       
                     ;
                      
                     
        private string postfix =
                        "}" +
                "}";
             
 
        public string CompileAndRun(string input, out bool hasError)
        {
 
             
            Form1 f= new Form1();
            hasError = false;
            string returnData = null;
 
            CompilerResults results = null;
 
            using (CSharpCodeProvider provider = new CSharpCodeProvider())
            {
                CompilerParameters options = new CompilerParameters();
                options.GenerateInMemory = true;
 
                StringBuilder sb = new StringBuilder();
                sb.Append(prefix);
                sb.Append(input);
                sb.Append(postfix);
 
                results = provider.CompileAssemblyFromSource(options, sb.ToString());
 
            }
 
 
            if (results.Errors.HasErrors)
            {

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Za Driver máte dvojtečku a chybí vám tam třída, ze které to má dědit. Buď ji tam doplňte, nebo dejte tu dvojtečku pryč.

A tu třídu DataClasses nevidíte, protože kompilátor neví, ze které assembly ji má vzít. Musíte mu do referencí přidat aktuální assembly.

1
provider.ReferencedAssemblies.Add(System.Reflection.Assembly.GetExecutingAssembly().FullName);

Píšu z hlavy, snad je to dobře.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diky za radu s assembli teprve zacinam. Jestli jsem to dobre pochopil tak jsem kompilatoru přidal aktualni assembly

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using (CSharpCodeProvider provider = new CSharpCodeProvider())
            {
                 
                
                CompilerParameters options = new CompilerParameters();
                options.GenerateInMemory = true;
                options.ReferencedAssemblies.Add(System.Reflection.Assembly.GetExecutingAssembly().FullName);
 
 
                StringBuilder sb = new StringBuilder();
                sb.Append(prefix);
                sb.Append(input);
                sb.Append(postfix);
                 
                results = provider.CompileAssemblyFromSource(options, sb.ToString());
 
            }

ale po spusteni mi vypise aktualni assembly s chybou:

0 Soubor s metadaty linqtosql, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null nebyl nalezen.

Mohl by jste mi prosim poradit v cem jeste delam chybu?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak to asi nesežere FullName té assembly. Zkuste jenom Name.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vlastnost Name to nema ale presto dekuju za ochotu pomoct, zkousel jsem i jeste něco jineho co me napadlo ale bez požadovaného výsledku. Kdyby Vás neco napadlo zkuste napsat.(me uz nic moc nenapada).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback