Laden...
D
dIeGoLi myCSharp.de - Member
Informatiker CH Dabei seit 10.10.2005 28 Beiträge
Benutzerbeschreibung

Forenbeiträge von dIeGoLi Ingesamt 28 Beiträge

31.12.2012 - 10:21 Uhr

Weil mir einige Leute Emails geschrieben habe, möchte ich den code hier aktualisieren.
Because there were some people mailing me, i'd like to update the class with some minor changes:


using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms.Integration;
using System.Windows.Interop;
using System.Windows.Media;

// Creation date: 24.09.2009
// Author: Diego Frehner (fdi@root.ch)

// This class is based on the explanation of http://blogs.msdn.com/ryanvog/archive/2009/01/20/clipping-legacy-content-hosted-inside-a-wpf-scrolling-region.aspx

namespace fdi {
  
  /// <summary>This class is a Windows Forms host which supports being inside a scroll container.</summary>
  /// <remarks>When you nest Windows Forms controls inside a WPF visual container the Windows Forms control actually 
  /// sits on top of the WPF window and maintains its own HWND. If the container is a scroll container (ScrollView),
  /// the clipping will not be done correctly. This windows forms sub class does the clipping.</remarks>
  public class ScrollableWindowsFormsHost : WindowsFormsHost {

    /// <summary>Top left x position of window region</summary>
    private Int32 _topLeftX = -1;

    /// <summary>Top left y position of window region</summary>
    private Int32 _topLeftY = -1;

    /// <summary>Bottom right x position of window region</summary>
    private Int32 _bottomRightX = -1;

    /// <summary>Bottom right x position of window region</summary>
    private Int32 _bottomRightY = -1;

    /// <summary>Scrollviewer on which scrollchanged event this instance listens.</summary>
    private ScrollViewer _scrollViewer;

    /// <summary>Track whether Dispose has been called.</summary>
    private Boolean _disposed = false;

    //--------------------------------------------------------------------------------
    /// <summary>Creates a scrollabel Windows Forms host.</summary>
    public ScrollableWindowsFormsHost() {
    }

    //--------------------------------------------------------------------------------
    #region Methods
    //--------------------------------------------------------------------------------

    //--------------------------------------------------------------------------------
    /// <summary>Creates a handle to a region specified through upper left and bottom right corner.</summary>
    /// <param name="x1">Upper left X</param>
    /// <param name="y1">Upper left Y</param>
    /// <param name="x2">Bottom right X</param>
    /// <param name="y2">Bottom right Y</param>
    /// <returns>Returns a handle to the created region.</returns>
    [DllImport("GDI32.DLL", EntryPoint = "CreateRectRgn")]
    private static extern IntPtr CreateRectRgn(Int32 x1, Int32 y1, Int32 x2, Int32 y2);

    //--------------------------------------------------------------------------------
    /// <summary>Sets the specified region to the specified window. That means the specified window can paint
    /// itself only in the specified region.</summary>
    /// <param name="hWnd">Handle to the window</param>
    /// <param name="hRgn">Hanlde to the region</param>
    /// <param name="bRedraw">Boolean indicating whether the specified region should be redrawn.</param>
    /// <returns>Returns nonzero if success, otherwise zero.</returns>
    [DllImport("User32.dll", SetLastError = true)]
    private static extern Int32 SetWindowRgn(IntPtr hWnd, IntPtr hRgn, Boolean bRedraw);

    //--------------------------------------------------------------------------------
    /// <summary>Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.</summary>
    /// <param name="bDisposing"><b>true</b> if the method has been called by applicaton code.</param>
    protected override void Dispose(Boolean bDisposing) {
      if (bDisposing) {
        try {
          if (!_disposed) {
            if (_scrollViewer != null) {
              _scrollViewer.ScrollChanged -= new ScrollChangedEventHandler(ScrollHandler);
            }
          }
          _disposed = true;
        }
        finally {
          base.Dispose(bDisposing);
        }
      }
    }
    
    //--------------------------------------------------------------------------------
    /// <summary>Register a scrollviewer on which this instance listens.</summary>
    /// <param name="scrollViewer">ScrollViewer</param>
    public void RegisterScrollViewer(ScrollViewer scrollViewer) {
      if (scrollViewer == null) {
        throw new ArgumentNullException("scollViewer");
      }
      if (_scrollViewer != null) {
        UnregisterScrollViewer(_scrollViewer);
      }
      scrollViewer.ScrollChanged += new ScrollChangedEventHandler(ScrollHandler);
      _scrollViewer = scrollViewer;

      // If you move focus inside a scrollviewer the scrollviewer adjusts its scroll value that the focused element is visible.
      // Unfortunately with a windows forms host this doesn't work.
      // So we register a got focus event and adjust the scrol value ourself.
      GotFocus += new RoutedEventHandler(ScrollableWindowsFormsHost_GotFocus);
    }

    //--------------------------------------------------------------------------------
    /// <summary>Unregister a scrollviewer.</summary>
    /// <param name="scrollViewer">ScrollViewer</param>
    public void UnregisterScrollViewer(ScrollViewer scrollViewer) {
      if (scrollViewer == null) {
        throw new ArgumentNullException("scollViewer");
      }
      scrollViewer.ScrollChanged -= new ScrollChangedEventHandler(ScrollHandler);
      GotFocus -= new RoutedEventHandler(ScrollableWindowsFormsHost_GotFocus);
      _scrollViewer = null;
    }
    #endregion

    //--------------------------------------------------------------------------------
    #region Events
    //--------------------------------------------------------------------------------

    //--------------------------------------------------------------------------------
    /// <summary>Scroll handler manages the clipping of this windows forms host.</summary>
    /// <param name="sender">Sender</param>
    /// <param name="ea">Event argument</param>
    private void ScrollHandler(Object sender, ScrollChangedEventArgs ea) {
      PresentationSource presentationSource = HwndSource.FromVisual(this);
      if (presentationSource == null) {
        return;
      }
      Visual rootVisual = presentationSource.RootVisual;
      if (rootVisual == null) {
        return;
      }
      ScrollViewer scrollViewer = (ScrollViewer)sender;
      if (!scrollViewer.IsDescendantOf(rootVisual)) {
        return;
      }

      // calculate the rect of scrollview with 0/0 at upper left corner of root visual
      GeneralTransform transform = scrollViewer.TransformToAncestor(rootVisual);
      Rect scrollRect = transform.TransformBounds(new Rect(0, 0, scrollViewer.ViewportWidth, scrollViewer.ViewportHeight));

      // calculate the rect of the scrollable windows forms host instance with 0/0 at upper left corner of root visual
      transform = this.TransformToAncestor(rootVisual);
      Rect hostRect = transform.TransformBounds(new Rect(this.Padding.Left, this.Padding.Right,
        this.RenderSize.Width, this.RenderSize.Height));

      // calculate the intersection of the two rect
      Rect intersectRect = Rect.Intersect(scrollRect, hostRect);

      Int32 topLeftX = 0;
      Int32 topLeftY = 0;
      Int32 bottomRightX = 0;
      Int32 bottomRightY = 0;
      if (intersectRect != Rect.Empty) {
        // calculate the HRGN points with 0/0 at upper left corner of scrollable windows forms host instance
        topLeftX = (Int32)(intersectRect.TopLeft.X - hostRect.TopLeft.X);
        topLeftY = (Int32)(intersectRect.TopLeft.Y - hostRect.TopLeft.Y);
        bottomRightX = (Int32)(intersectRect.BottomRight.X - hostRect.TopLeft.X);
        bottomRightY = (Int32)(intersectRect.BottomRight.Y - hostRect.TopLeft.Y);
      }

      // because the CreateRectRgn / SetWindowRgn api calls are slow we call them only if it has a visual effect
      if (_topLeftX != topLeftX || _topLeftY != topLeftY || _bottomRightX != bottomRightX || _bottomRightY != bottomRightY) {
        _topLeftX = topLeftX;
        _topLeftY = topLeftY;
        _bottomRightX = bottomRightX;
        _bottomRightY = bottomRightY;
        // create HRGN object and set it to the windows forms host instance
        IntPtr hrgn = CreateRectRgn(_topLeftX, _topLeftY, _bottomRightX, _bottomRightY);
        SetWindowRgn(this.Handle, hrgn, true);
      }
    }

    //--------------------------------------------------------------------------------
    /// <summary>Occurs on got focus and adjusts the scroll value of the registered scrollviewer that this is visible.</summary>
    /// <param name="sender">Sender</param>
    /// <param name="e">Event argument</param>
    private void ScrollableWindowsFormsHost_GotFocus(Object sender, RoutedEventArgs e) {
      Debug.Assert(_scrollViewer != null);
      // calculate the rect of this windows forms host instance with 0/0 at upper left corner of scrollviewer
      GeneralTransform transform = this.TransformToAncestor(_scrollViewer);
      Rect hostRect = transform.TransformBounds(new Rect(this.Padding.Left, this.Padding.Right,
        this.RenderSize.Width, this.RenderSize.Height));

      // if this element is not visible scroll to an offset which makes this windows forms host visible
      if (hostRect.Bottom > _scrollViewer.ViewportHeight) {
        _scrollViewer.ScrollToVerticalOffset(hostRect.Bottom - _scrollViewer.ViewportHeight + _scrollViewer.VerticalOffset);
      }
    }
    #endregion
  }
}

Ergänzung zur Verwendung des abgeleiteten Hosts aus xaml.

  1. Namespace / Referenz hinzufügen
xmlns:swfh="clr-namespace:fdi"

  1. Ableitung verwenden
<swfh:ScrollableWindowsFormsHost... 
  1. Anstelle der Register/Unregister Funktionen kann im Konstruktor des ScrollableWindowsFormsHost ein Klassen Eventhandler verwendet werden (Gruss an Avinash Singh)

//--------------------------------------------------------------------------------------
/// <summary>Creates a scrollabel Windows Forms host.</summary>
public ScrollableWindowsFormsHost() {
  EventManager.RegisterClassHandler(typeof(ScrollViewer), ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler(ScrollHandler));
}

09.10.2009 - 21:00 Uhr

Hallo,

du hast keine Möglichkeit den SecureString der Passwortbox zu setzen, ist Readonly.

Danke für deine Antwort. Leider hilft mir das nicht weiter.

Ich möchte den User das Passwort in einer Konfigurationsmaske hinterlegen lassen.
Es gibt diverse Anwendung bei denen man ein Passwort speichern kann. Wenn es gespeichert ist erscheint ein "Passwort Dialog" mit bereits ausgefüllten Feldern.
Wie machen die das? 🙂
Die müssen doch auch ein Passwort Control haben, dieses irgendwo ablegen und diesem Control später wieder zuweisen. Wenn man dabei String's benutzt ist das ganze doch nicht mehr sicher.
Wüsstest du einen Weg wie ich mein Vorhaben umsetzen kann?

Was mir auch durch den Kopf geht, wenn ich diesen SecureString verschlüsselt ablegen könnte und wieder in eine SecureString reinbringe, dann könnten doch andere das auch machen sobald Sie an das verschlüsselte Passwort kommen.
Vielleicht sollte ich auch einfach eine Nacht schlafen und mich morgen von neuem ransetzen....

09.10.2009 - 20:13 Uhr

Hallo zusammen,

Ich möchte eine PasswordBox benutzen um dem User die sichere Eingabe eines Passworts zu ermöglichen. Anschliessend möchte ich das verschlüsselte Passwort in einer Datenbank speichern.
Zum Schluss möchte ich dieses verschlüsselte Passwort wieder der PasswordBox zuweisen.

MSDN gibt sich sehr knapp mit Informationen und Beispiele in der Richtung fand ich keine.

Die Eingabe in der PasswordBox für sich funktioniert.
über PasswordBox.SecurePassword bekomme ich einen SecureString mit dem Wert. Diese Property ist nur get.

Was mich aber erstaunt, ist das die PasswordBox eine Property Password besitzt, über welche man das Passwort im Klartext lesen und schreiben kann.

Ich muss irgendwie das Password in verschlüsselter Form als String kriegen damit ich es abspeichern kann und nacher wieder als SecureString der PasswordBox zuweisen.
Ich sehe keine Möglichkeit dies zu tun.
Ich will nie mit dem Passwort im Klartext zu tun haben.

Ist mein Anwendungsfall so mit der PasswordBox nicht umsetzbar, oder erkenne ich nicht wie das zu machen wäre?

Danke für eure Ratschläge!

25.09.2009 - 15:51 Uhr

Hallo zusammen,

Aktuell besteht in WPF das Problem, dass ein WindowsFormsHost innerhalb eines ScrollViewer nicht zu gebrauchen ist, da der WindowsFormsHost in einem eigenen Fenster über dem WPF Inhalt "sitzt" und beim scrollen nicht verschwindet sondern über die WPF Oberfläche gezeichnet wird.

Das Problem ist im Blog von Ryan (Nachname nicht bekannt) mit Beispiel beschrieben und beschreibt auch den Ansatz nachdem ich meine Lösung geschrieben habe: Ryan's Blog.

Meine Lösung ist eine Ableitung des WindowsFormsHost welche das Clipping bei registriertem ScrollViewer übernimmt.

/** Code editiert, neue Version im nächsten Post **/

Es war nicht einfach und zeitaufwendig für mich diese Lösung zu schreiben und ich denke sie ist deswegen auch noch nicht perfekt. Ich würde mich über Kritik sowie Verbesserungsvorschläge freuen.

Liebe Grüsse
Diego

26.06.2009 - 11:18 Uhr

ganz praktisch das ding. danke 😉

15.05.2009 - 16:00 Uhr

ich bin jetzt schon einen schritt weiter ... das zusammenschreiben von obigen post hat mir geholfen ... ich denke ich hatte ein problem mit den namespaces wann wo welcher etc.

ich hoffe mal dass ich das problem jetzt lösen kann 😉

danke schonmal für die mühen

Hallo feldba,

Ich habe exakt das gleiche Verhalten wie du (ValidationEventHandler reagiert nicht auf Fehler). Mit dem Unterschied, dass ich die Klasse XDocument anstelle von XmlDocument und anschliessend extension Validate verwende.
Mein Code sieht so aus:


XDocument xdocument = XDocument.Parse(s);
XmlReader schemaReader = XmlReader.Create(GetType().Assembly.GetManifestResourceStream("MeinSchema.xsd"));
XmlSchemaSet schemas = new XmlSchemaSet();
// null bedeuted hier, dass er den targetNamespace verwendet welcher im Schema definiert ist
schemas.Add(null, schemaReader);
xdocument.Validate(schemas, ValidateEventHandler);

Ich habe das XML File manipuliert, so dass es Fehler melden müsste. Leider tut es dies nicht.

Das Beispiel gemäss: http://msdn.microsoft.com/en-us/library/bb354954.aspx
funktioniert bei mir.

Der Fehler muss also irgendwo bei mir liegen.

Ich kann mir wie du auch vorstellen, dass der Fehler irgendwie mit dem Namespace zusammenhängt. Hast du deinen Code zum laufen gebracht? Was war falsch bei dir?

Ein Hinweis könnte dies sein:
Bei dem Link ist eine Methode geposted DumpInvalidNodes(XElement el), welches die fehlerhaften Elemente protokolliert.
Zuerst rufe ich die Methode Validate mit einem dritten Parameter true auf.

xdocument.Validate(schemas, ValidateEventHandler, true);

"If addSchemaInfo is true, this method populates the XML tree with the post-schema-validation infoset (PSVI). "
Wenn ich nun bei meinen Elementen dies abfrage (el ist ein XElement):

el.GetSchemaInfo().Validity

resultiert der Wert "NotKnown".

Ich würde mich freuen, falls du deine Lösung kurz posten könntest.
Lg Diego

29.10.2008 - 19:14 Uhr

*push*

habe leider immer noch nichts gefunden. vielleicht liegts daran, dass ich die falschen Begriffe verwenden.
Ich mache ein Beispiel.
Ich möchte n Mitarbeiter n Gruppen zuweisen.
Eine mögliche Form dieses Controls Wäre eine tabellarische Darstellung.

.....MA1..MA2..MA3
G1...x..............x
G2...........x......x
G3...x......x.......x

(Die Punkte stellen nur die Einrückung sicher und haben keine Bedeutung)
In diesem Fall würde ich also diesem Control z.b. zwei Collections, eine mit Gruppen eine mit Mitarbeitern zur Verfügung stelle und das Kreuz (x) würde dann ein Link Objekt erstellen (oder entfernen falls die Zuweisung entfernt wird).

So ein "Matrix control" habe ich bereits. Aber es gibt doch sicher kreativere und bessere Möglichkeiten. Ich selber habe keine andere Idee 😕.

28.10.2008 - 15:22 Uhr

Hallo zusammen,
Kennt jemand ein gutes Control um N-N Zuweisungen abzubilden bzw. zu editieren? Habe leider noch nichts passendes gefunden und das bestehende ist nicht so der hit 😦.
Das Control würde kommerziell genutzt werden. Open source wäre ein starker Vorteil. Wenn jemand ein gutes WPF Control anstelle von Windows forms kennt wäre ich auch nicht abgeneigt 🙂. Die Applikation ist eh schon auf Framework 3.5 SP1; daher könnte ich auch ein WPF Control einbetten. Irgendwann später geht eh der Rest auch in die Richtung.

mfg und thx
Diego

21.07.2008 - 15:03 Uhr

Pass auf, dass dir die User nicht die Systemzeit ändern 😉

27.06.2008 - 14:54 Uhr

Wenn du den Garbage collector zwingen möchtest aufzuräumen kannst du dies mit
System.GC.Collect() machen. So könntest evt. testen ob dann die Fehler nach dem 5ten mal nicht mehr kommen. Wie sehen denn diese Fehler aus?
Mir ist bekannt, dass gewisse Objekte nie freigegeben werden solange events an diese gebunden sind.

23.04.2008 - 15:35 Uhr

Danke für den link Xqgene.

Ich habe die Lösung soeben selber gefunden. Die Lösung funktioniert so das anhand der ersten paar bytes das encoding gefunden wird.

Hier die Lösung:


//------------------------------------------------------------------------23.04.2008
/// <summary>Determines the encoding of the specified file.</summary>
/// <param name="sFileName">File to determine the encoding from.</param>
/// <returns>Returns the Encoding of the specified file.</returns>
public static Encoding encoding_DetermineFileEncoding(String sFileName) {
  if (String.IsNullOrEmpty(sFileName)) {
    throw new ArgumentNullException("sFileName");
  }
  if (!File.Exists(sFileName)) {
    throw new FileNotFoundException("File does not exists.", sFileName);
  }
  StreamReader streamReader = new StreamReader(sFileName, true);
  streamReader.ReadToEnd();
  Encoding encoding = streamReader.CurrentEncoding;
  streamReader.Close();
      
  return encoding;
}

so nach dem 4ten mal jetzt richtig ^^

23.04.2008 - 13:56 Uhr

Guten Tage zusammen,
Ich möchte gerne wissen in welchem Encoding ein bestimmtes File abgespeichert ist.
So in der Richtigung:
Encoding encoding = File.GetEncoding(sPath);

Der Grund wieso ich das wissen muss ist der. Meine Applikation liest sein Konfigurationsfile mit Hilfe der Klasse XMLDocument. Nur die Funktion XMLDocument.Load beachtet das Encoding nicht und das Framework verursacht eine Unhandled Exception, wenn das Konfigurationsfile nicht in UTF-8 abgespeichert ist und dieses Umlaute enthält.


XmlDocument xd = new XmlDocument();
xd.Load(sConfigFileName);

Um diesen Fehler zu verhindern möchte ich das Encoding des Files überprüfen und eine Meldung ausgeben, wenn dieses nicht in UTF-8 ist.

Meine Suche bis jetzt war leider erfolglos. Ein Kollege hat das Encoding mal überprüft indem er die ersten zwei bytes ausgelesen hat und so zwischen ansi und unicode unterscheiden konnte. Für mich geht das aber nicht.

Danke für Lösungsvorschläge

09.02.2007 - 16:23 Uhr

Freu dich. Mein ich wirklich 🙂

Ich würd mal sagen C++ ist schwieriger. Zumindest der Einstieg kam mir so vor. Ich hab zuerst auch Delphi und C# programmiert und später musste ich ein C++ Projekt realisieren.
Ich finde aber C++ gibt dir einen viel tieferen Einblick in die Programmierung und erweitert somit stark deinen Programmierhorizont. Vor allem da C# ja eigentlich eine Wrappersprache um C++ ist 😁 wächst dein Verständniss für gewisse Dinge.

Ich würds also als gute Gelegenheit anschauen dich tiefer mit der Programmierung zu beschäftigen.

15.09.2006 - 16:26 Uhr

@herbivore
ich dachte halt der will mich verarschen und muss ne andere ursache für den fehler geben da ich ja überzeugt war, dass er meine sta angabe frisst 🙂.

Also das problem ist gelöst 🙂. Hat aber ne weile gedauert X(

Meine applikation hat das sta thread attribut gesetzt!
Das Problem ist dieses:
Das Tool meines kollegen packt die applikationsdateien zusammen.
wenn man die output exe des tools startet, dann wird eine art starter gestartet, der die benötigten files entpackt und die main application ankickt.

[Vermutung]
wenn der parent thread (der starter) noch aktiv ist kann beim neuen thread (main app) der appartment state nicht gewechselt werden. standard ist mta. -> fehler
d.h. auch die sta deklaration bei der main function nützt nix 😠
[/Vermutung]

als ich den starter thread rechtzeitig beendet habe, konnte der apartment state der main app geändert werden. -> kein fehler und ein überglücklicher programmierer 😁

@sheitmann
wegen dem tool habe ich gefragt. er möchte es jedoch in diesem zustand nicht hergeben. zudem wird es anscheinend evt. doch verkauft. 🙁

danke für eure mühen 🙂

15.09.2006 - 14:10 Uhr

boah ich kann das nicht glauben 8o
hab die threadinfos mal bei programmstart ausgespuckt.
hat mir tatsächlich gesagt, dass der AppartmentState auf MTA gesetzt ist Oo.
Ich setze jedoch das sta attribut bei der main routine.
verdammt komisch. kann eigentlich nur ein bug sein. der packer verändert die dateien nicht. mal kucken. vielleicht hats mit deinem link doch noch etwas auf sich.

13.09.2006 - 18:14 Uhr

das tool ist in C# geschrieben. der link nützt also nix. aber trotzdem danke 🙂
für die projekte sektion ist es wohl noch nicht geeignet, da noch ein paar änderungen geplant sind die reengineering, was jetzt schon schwer ist, (unmöglich) machen soll. ich kann ja mal fragen 🙂

13.09.2006 - 17:05 Uhr

Original von sheitman
mal so nebenbei: gibts das tool irgendwo zum download? könnte dafür sogar eventuell verwendung haben =)

downloaden kann mans nicht. aber ich kann meinen arbeitskollegen fragen ob ichs weitergeben darf. hat er in der freizeit gemacht (kein firmending) 🙂. kann dir das dann morgen sagen.

13.09.2006 - 16:49 Uhr

@herbivore
das stathread attribut ist gesetzt und geht auch nicht verloren. gibt es andere ursachen für diesen drag & drop registration fehler?

@sheitman
ich habs mir das tool jetzt vom kollegen genauer erklären lassen 🙂
also das tool funktioniert so.
Die verschiedenen dateien sind verschlüsselt zusammengepackt als embedded resource in der neuen exe vorhanden. Die dateien werden dann dynamisch geladen wenn sie benötigt werden.
Die neue exe ("Entpacker") hat ebenfalls das STAThreadAttribute gesetzt.
Wie du richtig bemerkt hast, arbeitet das tool also doch ein bisschen anders als ILMerge.

13.09.2006 - 15:13 Uhr

Original von sheitman
schau dir mit reflector mal die assembly an, die du durch dein mergen ersteltl hast
dort insbesondere diese main-methode

ist dirt dieses attribut angegeben oder nicht?

hab ich soeben gemacht. Das Attribut ist gesetzt. Wäre auch unlogisch wenn nicht. Diese "Pack Tool" verändert die Files nicht. Er packt sie am stück zusammen.

Original von sheitman
ichdeke auch es liegt schlicht und ergreifend an dem tool
das wird dir deine attribute unterschlagen und dadurch kommt dann der fehler zustande

ja das muss es. nur um den fehler des tools zu finden muss ich wissen wie diese drag & drop registration abläuft bzw. was sie benötigt. das tool ist von einem arbeitskollegen deshalb könnte er dann diesen fehler beheben. leider gibts es momentan keine (kenne ich keine) gute alternative. Deshalb bleibe ich auch so hartnäckig dran den fehler des tools zu finden 🙂

Original von sheitman

so kann ich z.b. aus 5 dll's und einer exe nur eine exe machen.
ich würde das auc heher so handhaben das die exe datei auf die dlls verweist... aber jeder wie ers eben praktikabel findet 🙂

im prinzip macht das tool auch nicht viel anderes als ein verschlüsseltes zip archiv zu erstellen, das bei der ausführung wieder entschlüsselt und entpackt. Der grosse vorteil ist das so keine versionsprobleme zwischen dll und exe auftreten. so wird ein packet geliefert. 🙂

13.09.2006 - 13:45 Uhr

wir haben bisschen aneinander vorbei geredet 🙂
es geht mir nicht darum, dass ich von einem projekt nur eine dll habe.
sondern ich packe die dll's von mehrere projekten zusammen.
so kann ich z.b. aus 5 dll's und einer exe nur eine exe machen. Das sollte nach meinem wissen im VS nicht möglich sein.
hier hab ich einen link der die funktionalität von ILMerge beschreibt: http://research.microsoft.com/~mbarnett/ilmerge.aspx

meine kernfrage wegen drag & drop registration bleibt bestehen.

13.09.2006 - 12:16 Uhr

Original von herbivore
warum benutzt du überhaupt Tools zum Mergen? Man kann doch schon beim Build festlegen, was zusammengepackt werden soll.

Hmm beim build festlegen?
Es werden dll's von mehreren projekten und die main exe zusammengepackt. Wäre mir neu, dass Visual Studio so eine funktionalität bietet.
Verwechselst evt. was mit post und pre build events?

Ich benutze das Tool in erster Linie um die files zusammenzupacken. Zusätzlich werden die Files komprimiert und verschlüsselt was ebenfalls sehr wichtig ist.
Die versch. Files werden am Stück zusammengepackt und beim ausführen einzeln wieder geladen.
Kann da beim Packen etwas verloren gehen? bzw. wo sind diese attribute gespeichert?

13.09.2006 - 09:14 Uhr

Hallo herbivore,
Auf die Idee wär ich nicht gekommen 😜 😁
Fakt ist Tool1 und Tool2 machen irgend etwas anders. Beide Tools sind funktionsfähig. Nur das das eine probleme bei der drag & drop registration verursacht.
Ich würde gerne wissen was bei einer drag & drop registration abläuft bzw. was für daten benötigt werden.
Wenn ich das wüsste gäbe es vielleicht einen anhaltspunkt wieso es mit dem einen tool nicht geht.
Leider hab ich im Internet keinen artikel über diese registration gefunden. Das einzige was ich gefunden habe, sind irgendwelche posts wo leute das stathread attribut vergessen 🙂
gruss diego

edit:
Der Grund wieso ich nicht einfach das ILMerge benutze ist der, dass ILMerge noch probleme mit den sprach resourcen files hat. Naja und die mehrsprachigkeit ist relativ wichtig 😄. Das andere Tool hat ein arbeitskollege geschrieben und hat damit keine probleme. Nur da gibts eben die drag & drop probleme 😠

12.09.2006 - 14:10 Uhr

hallo,
ich benutze in einer applikation drag & drop funktionalitäten. Dies funktioniert einwandfrei.
Das Problem entsteht erst wenn ich die verschiedenen Dateien (*.dll *.exe,..) meiner applikation zusammenpacke.
Wenn ich ILMerge (Ein tool von microsoft um dateien zusammenzupacken) benutze treten ebenfalls noch keine Fehler auf. Wenn ich jedoch ein anderes Tool ("gleiche" funktionalität wie ILMerge) zum zusammenpacken benutze, tritt dieser Fehler auf:

************** Exception Text **************
System.InvalidOperationException: DragDrop registration failed. ---> System.Threading.ThreadStateException: The current thread must set to Single Thread Apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it.
at System.Windows.Forms.Control.SetAcceptDrops(Boolean accept)
--- End of inner exception stack trace ---
at System.Windows.Forms.Control.SetAcceptDrops(Boolean accept)
at System.Windows.Forms.Control.OnHandleCreated(EventArgs e)
at System.Windows.Forms.ListBox.OnHandleCreated(EventArgs e)
at System.Windows.Forms.Control.WmCreate(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ListBox.WndProc(Message& m)
at Root.RControls.RListBox.WndProc(Message& me)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Das STAThreadAttribute ist gesetzt. Da liegt der Fehler nicht. Sonst würde es ja auch in der ungepackten version nicht funktionieren.

Meine Frage ist nun, ob jemand weiss wie genau diese Drag & Drop registration funktioniert?

Vielen Dank schonmal für die Hilfe 🙂
Gruss dIeGoLi

**:::

Der Appartment state eines Threads (2) kann nicht geändert werden solange der Thread (1), der den Thread (2) gestartet hat noch aktiv ist.

D.h. Die STAThread Deklaration nützt nix wenn der Thread (2) im MTA Appartment state gestartet wird und der Starter Thread (1) noch aktiv ist. bzw. greift erst wenn der Thread (1) beendet wurde.

20.12.2005 - 09:11 Uhr

vielen dank für deinen hinweis 🙂
in einem anderen thema hier im forum
wurde dieser link erwähnt. ich denke das könnte weiterhelfen 🙂

.NET Licensing

19.12.2005 - 17:00 Uhr

hallo,
die Problemstellung sieht so aus:
der Verkäufer verkauft eine Lizenz für das Benützen einer DLL. Nun ist die Frage wie man überprüfen kann ob der Nutzer eine Lizenz für die DLL hat. Ein Arbeitskollege von mir hat mal bei einer trial version gesehen, dass die DLL durch einen key geschützt wurde. Weiss jemand etwas mehr darüber?
mfg diego

05.12.2005 - 15:40 Uhr

omg :evil:. ich hab den Bug gefunden. Die Sicherheitsrichtlinien wurden richtig erstellt. Jedoch wenn man sich in der Verwaltung im Punkt Microsoft .NET Framework "vers.nr." Configuration" die Sicherheitsrichtlinien anschaut und F5 drückt um die Ansicht zu aktualisieren, gibts zwar eine Sanduhr beim Mauszeiger und alles optische weist darauf hin, dass die Übersicht aktualisiert wurde, aber in Wirklichkeit wurde sie gar nicht aktualisiert -.-

Fenster schliessen und neu öffnen schafft abhilfe

05.12.2005 - 12:18 Uhr

Hallo,
Ich möchte gerne eine Sicherheitsrichtlinie mithilfe der .NET Klassen erstellen. Ich weiss, dass man caspol benutzen könnte, aber dieses arbeitet anscheinend nicht immer zuverlässig.
Ich habe schon viel nachgelesen. Jedoch stimmt irgendwas nicht ^^.
Der Code den ich geschrieben habe, verursacht keinen Fehler aber am Ende ist die Richtlinie nicht erstellt.


    /// <summary>Configures FullTrust for the entire installdirectory.</summary>
    private void ConfigureCodeAccessSecurity() {
      PolicyLevel machinePolicyLevel = null;
      System.Collections.IEnumerator policyHierarchy = SecurityManager.PolicyHierarchy();
      while (policyHierarchy.MoveNext()) {
        PolicyLevel level = (PolicyLevel)policyHierarchy.Current;
        if (level.Label.ToLower() == sInstallPolicyLevel.ToLower()) {
          machinePolicyLevel = level;
          // Create a new FullTrust permission set
          PermissionSet permissionSet = new  NamedPermissionSet(sNamedPermissionSet);
   
          IMembershipCondition membershipCondition = 
            new UrlMembershipCondition(@"file://" + Path.Combine(Zielpfad (liegt auf einen anderen Pc im Netz), "*"));      
          // Create the code group
          PolicyStatement policyStatement = new PolicyStatement(permissionSet);
          CodeGroup codeGroup = new UnionCodeGroup(membershipCondition, policyStatement);
          codeGroup.Name = sCodeGroupName;
          // Add the code group
          machinePolicyLevel.RootCodeGroup.AddChild(codeGroup);
          break;
        }
      }
      // Save changes
      SecurityManager.SavePolicyLevel(machinePolicyLevel);
  }

Ich habe auch beinahe den exakten Code aus dem Internet (Google Groups) ausgeführt. Jedoch hat dies auch nicht funktioniert.

Am Pc sollte es nicht liegen. Ich habs auf zwei versch. Maschinen getestet. Dass die Files nicht lokal liegen macht auch nichts. den wenn da ein lokaler pfad steht gehts genauso nicht. (wenn ich die richtlinie mit dem wizard erstelle wird der pfad auch akzeptiert und es funktioniert)

Kennt jemand einen Bug oder sieht jemand wo ein fehler sein könnte?

Danke für die Hilfe

10.10.2005 - 15:30 Uhr

hi,
ich möchte auf SQL Server 2000 über HTTP zugreifen. Wenn ich querys in einer URL verpackt abschicke geht das und das xml wird mir im browser auch dargestellt. (hab nach dem beschreib hier gehandelt Accesing SQL Server Using HTTP).

gibt es keine möglichkeit, dass ich einfach ganz "normale" querys abschicken kann, wie wenn ich lokal arbeiten würde. ich hab mir überlegt, dass ich einfach "Data Source" im connection string anpassen muss. aber das hat mich bisher auch nicht auf einen grünen zweig gebracht.
hat jemand erfahrung damit und kann mir evt. weiterhelfen?

danke im voraus

p.s. war mir nicht ganz sicher ob ich das unter Datentechnologien oder Web- und Netzwerktechnologien posten sollte. hoffe ist hier richtig