[C#] Namespace in Mono niet gekend

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben een programma aan het schrijven dat lokale gebruikers kan toevoegen, verwijderen, aanpassen, etc..

Ik heb dit allemaal gemaakt in Visual Studio onder Windows XP en alles werkt. Nu zou ik graag hebben dat het programma ook werkt onder Linux, daarvoor gebruik in Mono Developer 2.0.

Voor het Windows gedeelte gebruik ik de namespace "using System.DirectoryServices;" en ik maak overal gebruik van DirectoryEntry. Nu kan ik zelfs niet eens beginnen in Mono Developer aangezien hij mijn Windows gedeelte niet kan compileren omdat hij de namespace System.DirectoryServices niet kent. Natuurlijk kan ik heel mijn Windows code niet gaan aanpassen en andere methodes gebruiken.

Is er een oplossing hiervoor? Misschien een dll toevoegen en 'cheaten'?

Acties:
  • 0 Henk 'm!

  • pasz
  • Registratie: Februari 2000
  • Laatst online: 01-09 23:08
Dat is nogal logisch, want DirectoryServices namespace geeft toegang to Active Directory Domain Services.

Met andere woorden, wil je een Linux gebruiker toevoegen ?

woei!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil inderdaad nu hetzelfde maken maar dan voor Linux, in 1 zelfde applicatie dus.

Ik heb al de code geschreven die kijkt of als je op Windows of op Linux zit. Als je op Linux zet gaat die andere code gebruiken (uiteraard), maar de code van Windows zit er ook nog tussen, weliswaar ongebruikt. Maar dat is een probleem aangezien Mono sommige code dus niet kan compileren, die using namespace directoryservices. Dat moet ook helemaal niet want die zal dat niet gebruiken in Linux maar goed, ik kan die lijn ook niet weghalen want dan werkt de app in windows niet meer.

Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 11-09 18:27
Je moet met preprocessor directives je Windows Code en Linux code scheiden. Als je dan compileert voor Windows definieer je een Win32 directive en compileer je voor Linux een Linux directive. Zo weet de compiler dat hij bepaalde code niet moet compileren.

Voorbeeldje:
C#:
1
2
3
4
5
6
7
#define Win32

#if Win32
   using System.DirectoryServices;

   //De rest van je code.
#endif

[ Voor 17% gewijzigd door urk_forever op 13-03-2010 16:15 ]

Hail to the king baby!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Blijkt niet te werken. Als ik wil compileren in Mono krijg ik nog steeds dezelfde melding, enkel nu op de lijn binnen die if. Volgens mij gaat die voor die het programma start gewoon alle code af, maakt niet uit of als het in een if staat of niet.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op zaterdag 13 maart 2010 @ 19:21:
Blijkt niet te werken. Als ik wil compileren in Mono krijg ik nog steeds dezelfde melding, enkel nu op de lijn binnen die if. Volgens mij gaat die voor die het programma start gewoon alle code af, maakt niet uit of als het in een if staat of niet.
Gebruik je wel een #if i.t.t. een "gewone" if en heb je dan ook de juiste define gebruikt als je in Mono gaat compileren? Het gaat hier om preprocessor directives zoals gezegd.

[ Voor 7% gewijzigd door RobIII op 13-03-2010 21:10 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik denk dat ik het inderdaad niet zo goed begrijp, heb er namelijk nog niet van gehoord, ik heb het zo gebruikt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#define Win32
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
//using System.DirectoryServices;
using System.Collections;

#if Win32
using System.DirectoryServices;
namespace UserApp
{
    public partial class frmMain : Form
    {

// al mijn windows code

    }
}
#endif


Als ik dit compileer in Mono zegt hij op lijn 14 dat hij dit niet kent.

Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 01:06

Reptile209

- gers -

Het idee van de #define's is dat je ze aanpast aan het OS waar je voor wil compileren. De eerste #define Win32 moet er alleen staan voor je Windows-build. Als je voor Linux gaat compileren, moet je die #define weglaten. En dan vallen opeens alle stukken Windows-code weg door de #if-#endif's.

Je code moet er uiteindelijk zo uitzien:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Hier de algemene code voor alle OS-en:
int Moooo(double);

#ifdef Win32
  Hier je Win32 code:
  void Foo(void);
  int Bar(void);
#endif

#ifdef Linux
  Hier je Linux code:
  void Foo(void);
  int Bar(void);
#endif

#ifdef EenAnderExotischOS
  Hier je bizarre code:
  void Foo(void);
  int Bar(void);
#endif

Als je nu aan je compiler een optie meegeeft om de juiste #define op te nemen (Win32, Linux, enz), dan laat hij alleen de code staan die je nodig hebt.

[ Voor 48% gewijzigd door Reptile209 op 14-03-2010 11:05 ]

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt, het is duidelijk nu! Heb mijn code aangepast, krijg geen error meer bij het runnen en hij geeft de melding 'Succesvol gebouwd.'. Echter krijg ik mijn programma niet te zien. In het venster 'Uitvoer van de applicatie' krijg ik:
Unhandled Exception: System.Resources.MissingManifestResourceException: Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "UserApp.frmMain.resources" was correctly embedded or linked into assembly "UserApp" at compile time, or that all the satellite assemblies required are loadable and fully signed.
at System.Resources.ResourceManager.AssemblyResourceMissing (System.String fileName) [0x00000]
at System.Resources.ResourceManager.InternalGetResourceSet (System.Globalization.CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) [0x00000]
at System.Resources.ResourceManager.InternalGetResourceSet (System.Globalization.CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) [0x00000]
at System.Resources.ResourceManager.InternalGetResourceSet (System.Globalization.CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) [0x00000]
at System.Resources.ResourceManager.GetObject (System.String name, System.Globalization.CultureInfo culture) [0x00000]
at System.Resources.ResourceManager.GetObject (System.String name) [0x00000]
at UserApp.frmMain.InitializeComponent () [0x002c6] in /home/koen/UserApp/UserApp/Form1.Designer.cs:102
at UserApp.frmMain..ctor () [0x00040] in /home/koen/UserApp/UserApp/Form1.cs:28
at (wrapper remoting-invoke-with-check) UserApp.frmMain:.ctor ()
at UserApp.Program.Main () [0x0000b] in /home/koen/UserApp/UserApp/Program.cs:17

The application was terminated by a signal: SIGHUP
Daar snap ik niets van. Het resources bestand is mooi aanwezig en daar ben ik helemaal niet aan gekomen. Wel bij de referenties staan er 2 in het rood, System.Deployment & System.DirectoryServices, maar dat is normaal aangezien hij die niet vind maar dus ook niet gebruikt, dit levert slechts een waarschuwing op.

EDIT: Excuseer, ik was een beetje te rap. Heb de foutmelding opgezocht en het blijkt dat deze voorkomt als je dingen declareert voor je de form declareert, de #if Win32, using system.xxxx had ik voor de form gezet, heb hem er nu ingezet en het werkt!

[ Voor 5% gewijzigd door Verwijderd op 14-03-2010 11:33 ]

Pagina: 1