Avatar billede tdafoobar Nybegynder
31. maj 2006 - 22:40 Der er 15 kommentarer og
1 løsning

HTML + DLL - hvordan ?

Hejsa

Hvis jeg har en compiled class, jeg ønsker at bruge i forbindelse med et ASP.NET dokument (HTML dokumentet) hvordan gør jeg så ?

(Ja, har snakket lidt med nogle andre i et andet spørgsmål, dog uden løsning.)

Lige nu har jeg:

index.aspx
bin/Guestbook.dll
bin/GuestbookView.dll
bin/MySql.Data.dll

Som jeg bruger, og hvor koden på index.aspx er:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head>
    <title> thedeathart | Guestbook </title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <link href="style.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="guestbook.js"></script>
  </head>
  <body>
    <div>
      <h1>My Guestbook</h1>
      <div id="paging">
      Pages:
        <asp:Repeater ID="linklist" runat="server">
          <ItemTemplate>
            <a <%# DataBinder.Eval(Container.DataItem,"isSelected") %>
              href="index.aspx?offset=<%# DataBinder.Eval(Container.DataItem,"offset") %>">
            <%# DataBinder.Eval(Container.DataItem,"pageNum") %></a>
          </ItemTemplate>
        </asp:Repeater>
      </div>
      <br />
      <div id="msgbox">
        <asp:Repeater ID="msglist" runat="server">
          <ItemTemplate>
            <a href="mailto:<%# DataBinder.Eval(Container.DataItem,"strEmail") %>">
            <%# DataBinder.Eval(Container.DataItem,"strName") %></a>
            - <span class="date"><%# DataBinder.Eval(Container.DataItem,"datDate","{0:D}") %></span>
            <p class="item">
              <%# DataBinder.Eval(Container.DataItem,"txtMessage").ToString().Replace("\n","<br />") %>
            </p>
          </ItemTemplate>
        </asp:Repeater>
      </div>
      <form runat="server">
        <asp:Label id="error" runat="server" class="error" />
        <fieldset id="sign">
          <legend class="hand">Sign the guestboook</legend>
          <div id="fcontent">
            <p>
              <label>Name</label>
              <asp:RequiredFieldValidator
                  id="nameValidator"
                  runat="server"
                  ControlToValidate="name"
                  display="static"
                  ErrorMessage="Please write your name"
                  />
              <br>
              <asp:TextBox id="name" runat="server" class="f" />
            </p>
            <p>
              <label>Email</label>
              <asp:RequiredFieldValidator
                  id="emailValidator"
                  runat="server"
                  ControlToValidate="email"
                  display="static"
                  ErrorMessage="Remember to enter your email"
                  />
              <br/>
              <asp:TextBox id="email" runat="server" class="f" />
            </p>
            <p>
              <label>Message</label>
              <asp:RequiredFieldValidator
                  id="messageValidator"
                  runat="server"
                  ControlToValidate="message"
                  display="static"
                  ErrorMessage="Please write a message"
                  />
              <br/>
              <textarea id="message" cols="0" rows="0" runat="server" />
            </p>
            <p>
              <asp:button id="submit" runat="server" Text="Sign!" onclick="Insert" />
            </p>
            </div>
        </fieldset>
      </form>
    </div>
  </body>
</html>

Problemet her er så at lade index.aspx få adgang til at bruge GuestbookView.dll. Har prøvet med <%@ Page Language="C#" Inherits="GuestbookView" %> men det ændre intet.
Det resulterer altid i samme fejl:

Parser Error Message: Could not load type 'GuestbookView'.

Bemærk at det er manual compiled, og I skal forestille jer en case, hvor dette f.eks. er et system som skulle uploades til en FTP. Glem ALT omkring Visual Studio, tak.
Avatar billede snepnet Nybegynder
01. juni 2006 - 02:44 #1
Det ville fint hvis du postede noget kode hvor GuestbookView indgik + dine directives.
Din cs-fil må du også gerne sende.
Hvad ligger der i GuestbookView, som du regner med at kunne bruge?
Mvh
Avatar billede tdafoobar Nybegynder
01. juni 2006 - 13:01 #2
GuestbookView.cs

using System;
using System.Data;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

public class GuestbookView : System.Web.UI.Page
{
  public Repeater linklist;
  public Repeater msglist;
  public Label    error;
  public TextBox  name;
  public TextBox  email;
  public HtmlTextArea message;

  protected int LIMIT  = 5;
  protected int OFFSET = 0;

  private Guestbook gb;

  public GuestbookView()
  {
    gb = new Guestbook();
  }

  public void Page_Load(object sender, EventArgs e)
  {
    if(Request.QueryString["offset"] != null)
    {
      OFFSET = Int32.Parse(Request.QueryString["offset"]);
    }
    if(!Page.IsPostBack)
    {
      msglist.DataSource = gb.getRows(OFFSET,LIMIT);
      msglist.DataBind();

      linklist.DataSource = generatePaging(gb.getNumRows());
      linklist.DataBind();
    }
  }

  private DataSet generatePaging(int numRows)
  {
    DataSet ds = new DataSet();
    DataTable dt = ds.Tables.Add("links");
    dt.Columns.Add("offset",Type.GetType("System.String"));
    dt.Columns.Add("pageNum",Type.GetType("System.String"));
    dt.Columns.Add("isSelected",Type.GetType("System.String"));

    // Generate the page links dataset
    DataRow dr;
    int p = 1;
    for(int i=0;i<numRows;i+=LIMIT)
    {
      dr = dt.NewRow();
      dr[0] = i;
      dr[1] = p;
      dr[2] = "";
      if(i == OFFSET) { dr[2] = "class=\"selected\""; }
      dt.Rows.Add(dr);
      p++;
    }
    return ds;
  }

  public void Insert(object sender, EventArgs e)
  {
    if(Page.IsValid)
    {
      try
      {
        gb.Insert(name.Text,email.Text,message.Value);

        string url = "index.aspx?" + Request.QueryString;
        Response.Redirect(url);
      }
      catch(Exception ex)
      {
        error.Text = ex.ToString();
      }
    }
  }
 
  public void DeleteChecked(object sender,EventArgs e)
  {
    if(Page.IsPostBack)
    {
      try
      {
        foreach(RepeaterItem item in msglist.Items)
        {
          HtmlInputCheckBox cb = item.FindControl("chkChoice") as HtmlInputCheckBox;
          if(cb.Checked)
          {
            gb.Delete(Convert.ToInt32(cb.Value));
          }
        }
        string url = "admin.aspx?" + Request.QueryString;
        Response.Redirect(url);
      }
      catch(Exception ex)
      {
        error.Text = ex.ToString();
      }
    }
  }

}
Avatar billede tdafoobar Nybegynder
01. juni 2006 - 13:01 #3
Guestbook.cs

using System;
using System.Data;           
using System.Collections;
using MySql.Data.MySqlClient;

public class Guestbook : System.Web.UI.Page
{
  private MySqlConnection link;

  public Guestbook()
  {
    string DSN = "DATABASE=guestbook;DATA SOURCE=localhost;USER ID=root;";
    link = new MySqlConnection(DSN);
  }

  public DataSet getRows()
  {
    // Select and bind the output rows
    string SQL = @"SELECT
                          guestbookID
                          ,strName
                          ,strEmail
                          ,txtMessage
                          ,datDate
                  FROM
                          guestbook
                  ORDER BY
                          guestbookID
                ";
    MySqlCommand cmd = new MySqlCommand(SQL);
    cmd.Connection = link;
    cmd.Connection.Open();

    DataSet ds = new DataSet();
    MySqlDataAdapter adapter = new MySqlDataAdapter();
    adapter.SelectCommand = cmd;
    adapter.Fill(ds);
    cmd.Connection.Close();

    return ds;
  }

  public DataSet getRows(int offset,int limit)
  {
    // Select and bind the output rows
    string SQL = @"SELECT
                          guestbookID
                          ,strName
                          ,strEmail
                          ,txtMessage
                          ,datDate
                  FROM
                          guestbook
                  ORDER BY
                          guestbookID
                  LIMIT
                          ?offset,?limit
                ";
    MySqlCommand cmd = new MySqlCommand(SQL);
    cmd.Connection = link;

    cmd.Connection.Open();
    cmd.CommandText = SQL;
    cmd.Prepare();

    cmd.Parameters.Add("?offset",offset);
    cmd.Parameters.Add("?limit",limit);

    DataSet ds = new DataSet();
    MySqlDataAdapter adapter = new MySqlDataAdapter();
    adapter.SelectCommand = cmd;
    adapter.Fill(ds);
    cmd.Connection.Close();

    return ds;
  }

  public int getNumRows()
  {
    MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) AS numRows FROM guestbook");
    cmd.Connection = link;
    cmd.Connection.Open();
    MySqlDataReader mdr = cmd.ExecuteReader();
    mdr.Read();
    cmd.Connection.Close();
    return mdr.GetInt32(0);
  }

  public void Insert(string name,string email,string message)
  {
    string SQL = @"INSERT INTO
                              guestbook(strName
                                        ,strEmail
                                        ,txtMessage
                                        ,datDate)
                  VALUES (?name,?email,?message,NOW())
                  ";
    MySqlCommand cmd = new MySqlCommand();
    cmd.Connection = link;
    cmd.Connection.Open();

    cmd.CommandText = SQL;
    cmd.Prepare();

    cmd.Parameters.Add("?name", name);
    cmd.Parameters.Add("?email", email);
    cmd.Parameters.Add("?message", message);

    cmd.ExecuteNonQuery();
    cmd.Connection.Close();
  }
 
  public void Delete(int gID)
  {
    string SQL = "DELETE FROM guestbook WHERE guestbookID=?id";
    MySqlCommand cmd = new MySqlCommand();
    cmd.Connection = link;
    cmd.Connection.Open();
   
    cmd.CommandText = SQL;
    cmd.Prepare();

    cmd.Parameters.Add("?id",gID);

    cmd.ExecuteNonQuery();
    cmd.Connection.Close();
  }

}
Avatar billede tdafoobar Nybegynder
01. juni 2006 - 13:02 #4
Men dette burde være irellevant! Hvis det skal være muligt at uploade et ASP.NET script på en webserver via. FTP, og at det så kører derefter, er den bagligende C# kode vel ligegyldig, da formålet med at compile dem, netop er IKKE at sende .cs filerne med?
Avatar billede tdafoobar Nybegynder
01. juni 2006 - 22:50 #5
ingen som ved hvordan ? Eller ved I kun hvordan man gør i Visual studio -_-
Avatar billede snepnet Nybegynder
01. juni 2006 - 23:18 #6
Årsagen til at jeg ville se det var - at det ikke var åbenlyst hvad det var der var i dine dll'er... Jeg var i tvivl om hvorvidt det var dine codebehind filer du havde kompileret, eller noget andet.
Hvis du ellers har den filstruktur du har beskrevet i ROOT af dit web burde det virke med et pagedirective sådan her:
<%@ Page language="c#" Inherits="GuestbookView" %> kan du ikke prøve det igen, og sikre dig at filerne ligger i root af dit web, og skrive hvad det er du ellers har prøvet

Men jeg forstår ikke hvad det er for noget du gerne vil opnå... Du har 2 ganske typiske codebehind-filer, du gerne vil have under samme site, og du har én side - som hedder noget andet end dine code-behindklasser.
Desuden refererer den ene side fra den anden i progammatiskm, men jeg går ud fra at det slet ikke er meningen at Guestbook skal være en specialisering af Page... Eller hva?

Hvis folk får uautoriseret adgang til serveren og er interesseret i din kode - forhindrer det at du ikke sender cs-filer med ikke rigtig noget.
.NET assemblies er åbne som bøger.... Du kan gøre dem lidt vanskeligere at læse, hvis du bruger en dotfuscator.

Hvorfor bruger du ikke version 2.0 og vs express produkterne ell. (de er gratis) ?

Mvh
Avatar billede snepnet Nybegynder
01. juni 2006 - 23:19 #7
(ikke EN dotfuscator... blot dotfuscator - det er et produkt)
Avatar billede tdafoobar Nybegynder
01. juni 2006 - 23:24 #8
"Desuden refererer den ene side fra den anden i progammatiskm, men jeg går ud fra at det slet ikke er meningen at Guestbook skal være en specialisering af Page... Eller hva?"
- det er en ups, har glemt at fjerne så den ikke extender page mere ;)

Testede lige med filerne I root, så virker det fint. Men hvis jeg nu IKKE ønsker filerne i root ?
Avatar billede tdafoobar Nybegynder
01. juni 2006 - 23:27 #9
Upgradere til .NET 2.0 nu, men jeg ønsker at lære sproget, ikke at bruge et IDE, hvilket også har gjort mig temmelig gnaven med så mange tutorials målrettet visual basic og visual studio only.
Avatar billede snepnet Nybegynder
01. juni 2006 - 23:29 #10
Du skal have dine dll'er i root - eller få konfigureret din subfolder op som en applikation.
Dine aspx-filer kan du lægge hvor du vil.

Den model du har valgt er for øvrigt den model som Visual Studio 2003 benytter pr. default - bortset fra at du lader frameworket wire dine events op automatisk, istedet for at gøre det manuelt som det er tilfældet i Visual Studio 2003 template'en.. Den automatiske model kan give dig nogle mindre performancehits i visse situationer.

Mvh
Avatar billede snepnet Nybegynder
01. juni 2006 - 23:29 #11
(altså dine dll'er i bin-folderen i root)
Avatar billede tdafoobar Nybegynder
01. juni 2006 - 23:31 #12
"Den model du har valgt er for øvrigt den model som Visual Studio 2003 benytter pr. default - bortset fra at du lader frameworket wire dine events op automatisk, istedet for at gøre det manuelt som det er tilfældet i Visual Studio 2003 template'en.. Den automatiske model kan give dig nogle mindre performancehits i visse situationer."

Den fik jeg ikke lige fat I, positivt eller negativt den måde jeg har gjort det på ? og hvis negativt, hvordan skulle jeg så gøre istedet.
Avatar billede snepnet Nybegynder
01. juni 2006 - 23:41 #13
Ikke som sådan negativt... Den template der er foreslået fra MS angiver bare at standard pageevents ikke skal wires automatisk, men i din kode... I praksis:

<%@ Page language="c#" Inherits="GuestbookView" AutoEventWireUp="false" %>

og lidt ekstra linier i din code-behind:

// overskrivning af OnInit:
protected override void OnInit(EventArgs e)
{
  // hook load op
  this.Load += new EventHandler(this.Page_Load);
}

(faktisk er der to metoder i standard-templaten... en InitializeComponent-metode, og den viste overskrivning af OnInit... InitializeComponent gør bare ikke andet end at hooke load op).

Egentlig synes jeg at det giver et bedre billede af hvad der egentlig foregår, men det er self. også nogle lidt fjollede linier at have stående i hver eneste code-behind fil.
Hvis jeg selv skrev det hele uden brug af et miljø, ville jeg gøre som du har gjort, og desuden benytte Src-attributten i mit page-directive så jeg slap for at kompilere manuelt i tide og utide.

Mvh
Avatar billede tdafoobar Nybegynder
01. juni 2006 - 23:43 #14
dvs. hvis jeg bruger src="minfil.cs" så skal jeg ikke compile den ? neat:)

læg et svar btw.
Avatar billede snepnet Nybegynder
01. juni 2006 - 23:46 #15
Du kan i hvert fald benytte den i forbindelse med udvikling, så det går lidt snildere... Når du så skal distribuere løsningen på et tidspunkt, kan du jo fjerne attributten, og udføre en manuel kompilering, og så distribuerer de assemblies du ender op med (hvis du stadig helst vil undgå at lægge cs-filerne med ud).
Mvh
Avatar billede tdafoobar Nybegynder
01. juni 2006 - 23:49 #16
mange tak :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester