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:

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.

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

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
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

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