|
Not everything you need is exposed in .NET because the framework would be huge! This isn't a hard solution, either.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
I have been sitting with a blob issue for the last day or so now. I am inserting a < 8k blob (image) into my MSSQL database from a OpenDialog Box, which I then from the database try and display in a PictureBox.
This is not working, purely becuase no matter what I do I keep on getting a "System Error" which makes no sense... I stream the image in and stream it out... into the picturebox. Anyone have any thoughts? Help?
Stitch
|
|
|
|
|
I got this working... thanx
|
|
|
|
|
i had wrote a set of class's for sending serialized objects over the net using sockets not to long ago..it worked perfectly then. I wrote a few programs (chat/file sharing) using the classes and they also worked perfectly. Just tonight i went back to use it agian with some new idea's and i have noticed i cant get my sockets to listen all of a sudden. i traced the error down to when the socket calls BeginAccept (the listening socket which is already done doing the setup to be in the listening state). I dont know if this is a code problem because i know for sure i havent touched the code when i used it, i just used the compiled dll's.I tryed uninstalling my old fire wall to see if thats the problem *zone alarm* but it didnt seem to fix it. The sending portion seems to work but the error only lies when i try to call begin accept intialy, This happens so when a connection does come in it is ready to accept it.here is the code with the error.
<br />
IPEndPoint ipe = new IPEndPoint(GetMachineIPAddress(),39888);<br />
MainListener= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);<br />
MainListener.Bind(ipe);<br />
MainListener.Listen(300);<br />
Thread.Sleep(10);<br />
MainListener.BeginAccept(new AsyncCallback(MainListenerBeginAccept),MainListener); <br />
if anyone wants to see the full code i would send it...its large and uses compression/serializing/encryption/ect/bla bla bla.
thanks alot for your help with this.
Jesse M
The Code Project Is Your Friend...
|
|
|
|
|
do you call EndAccept in your AcyncCallBack method? Something like this:
private void MainListenerBeginAccept(IAsyncResult asyncresult)
{
Socket s = (Socket)ar.AsyncState;
Socket s2 = s.EndAccept(ar);
}
Note I haven't tried it out, so it may or may not work. If you like I can have a look at your MainListenerBeginAccept method.
Ronny Andersson
|
|
|
|
|
yeah i do....here is the method i use. try running the code in junction with this and see if it works...
private void MainListenerBeginAccept(IAsyncResult e)
{
try
{
//MessageBox.Show("Acception connection");
Socket main = (Socket)e.AsyncState;
Socket secondary = main.EndAccept(e);
if(secondary!=null)
{
StateObject tr = new StateObject();
//MessageBox.Show(secondary.Available.ToString()+" ava");
tr.buffer = new byte[bufferSize];
tr.MainSocket = main;
tr.socket = secondary;
//
//Console.WriteLine("Beging To Accept");
//
SocketsConnected.Add(secondary);
//
//secondary.BeginReceive(tr.buffer,0,tr.buffer.Length,SocketFlags.None,new AsyncCallback(PendingConnectionReveive),tr);
}
MainListener.BeginAccept(new AsyncCallback(MainListenerBeginAccept),MainListener);
}
catch(System.ObjectDisposedException){}
catch(Exception ex)
{
OnError(this,ex);
}
}
The Code Project Is Your Friend...
|
|
|
|
|
I wrote a small test prog this morning just for fun. It is a very primitive
and small webserver it only sends a greeting back to the webbrowser.
Try it out locally on your machine with a webbrowser, then try it out
with between two machines. Try changing the port from 80 to something else
(I marked the line in red bold in the code) and try calling it again
if it doesn't work I agree with you it might be a firewall problem.
I've only got one PC at home so I cannot test it between two PCs.
God Luck
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace TestSocket
{
class MiniWebServer
{
public static void OnAcceptConnection(IAsyncResult ar)
{
Socket serverSock = (Socket)ar.AsyncState;
Socket clientSocket = serverSock.EndAccept(ar);
try
{
serverSock.BeginAccept(new AsyncCallback(MiniWebServer.OnAcceptConnection),serverSock);
ClientStateObject cso = new ClientStateObject();
cso.worksocket = clientSocket;
clientSocket.BeginReceive(cso.buffer, 0, 256, SocketFlags.None,
new AsyncCallback(MiniWebServer.OnDataReceived), cso);
}
catch(Exception e)
{
serverSock.Close();
Console.WriteLine(e.ToString());
}
}
public static void OnDataReceived(IAsyncResult ar)
{
ClientStateObject cso = (ClientStateObject)ar.AsyncState;
try
{
int read = cso.worksocket.EndReceive(ar);
Console.WriteLine(Encoding.ASCII.GetString(cso.buffer,0,read).ToString());
if(read == 256)
{
cso.worksocket.BeginReceive(cso.buffer,0,256,SocketFlags.None,
new AsyncCallback(MiniWebServer.OnDataReceived), cso);
}
else
{
cso.buffer = Encoding.ASCII.GetBytes("<html><body>Hello from the MiniWebServer</body></html>");
cso.worksocket.BeginSend(cso.buffer, 0, cso.buffer.Length, SocketFlags.None,
new AsyncCallback(OnDataSent), cso);
}
}
catch(Exception e)
{
cso.worksocket.Close();
Console.WriteLine(e.ToString());
}
}
public static void OnDataSent(IAsyncResult ar)
{
ClientStateObject cso = (ClientStateObject)ar.AsyncState;
try
{
int sent = cso.worksocket.EndSend(ar);
}
catch(Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
cso.worksocket.Close();
}
}
[STAThread]
static void Main(string[] args)
{
Socket serverSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
<code>IPEndPoint endPoint = new IPEndPoint(0,80);</code>
serverSock.Bind(endPoint);
serverSock.Listen(1000);
serverSock.BeginAccept(new AsyncCallback(MiniWebServer.OnAcceptConnection),serverSock);
Console.ReadLine();
}
private class ClientStateObject
{
public Socket worksocket;
public byte[] buffer = new byte[256];
}
}
}
Ronny Andersson
www.codelive.com
|
|
|
|
|
i think it might be something my firewall because i cant even get a response out of this line of code
serverSock.BeginAccept(new AsyncCallback(MiniWebServer.OnAcceptConnection),serverSock);
it locks the program up every single time. i also noticed something strange...i like to seed my Random class with the current time..so i pass in this
Random rn = new Random((int)DateTime.Now.Ticks);
but every time i ran the code line above it would throw a stack overflow exception. I also tryed uninstalling / disabling the firewall and it didnt seem to do anything.Should i try reinstalling the framework or something ? any ideas ?
The Code Project Is Your Friend...
|
|
|
|
|
I found the problem. I was using this program called steganos internet anonm sounded intresting...makes your browser essentially hidden...but it must of be acting as a firewall also...blocking the framework form listening...my firewall was off...but even when it wasnt it said the my program was listening, so steganos must of be running between the too. Anyways thanks sooo much for your help i really apreciate it.
Jesse M.
The Code Project Is Your Friend...
|
|
|
|
|
Hi!
I have 2 different applications/assembly. The first one creates an object and serializes it to a textfile on disk.
The second one has the the exact same class (copied/pasted). It reads the file that is on disk and attempts to deserialize it and create a new object.
The process works fine if I serialize/deserialize in the first application, but it fails when I try to deserialize in the second application. Here's the exception:
Parse Error, no assembly associated with Xml key a1:http://schemas.microsoft.com/clr/nsassem/UI/UI%2C%20Version%3D1.0.1419.30011%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull AdonisConfigDisk
Although it is generally not a good idea to copy/paste code like I did (I should have 1 dll with the code I need), I am forced to do so for some reasons I won't go into right now.
Here's my code... Does anyone have an idea of what I'm doing wrong? How can I strip the assembly information from the serialized object?
<br />
public MemoryStream Serialize() {<br />
MemoryStream stream = New MemoryStream();<br />
SoapFormatter sf = New SoapFormatter(null, New StreamingContext(StreamingContextStates.All));<br />
sf.Serialize(stream, this);<br />
stream.Seek(0, 0);<br />
return stream;<br />
}<br />
<br />
public AdonisConfigDisk Deserialize(MemoryStream ms) {<br />
SoapFormatter sf = New SoapFormatter(null, New StreamingContext(StreamingCOntextStates.All));<br />
return DirectCast(sf.Deserialize(ms), AdonisConfigDisk);<br />
}<br />
Thanks!
Carl
|
|
|
|
|
The problem is that when you serialize an object, its Type is saved so that it can be deserialized to the proper object type later. In your error, that should now be clear. A Type includes the namespace, class name, assembly name, culture, version, and public key tokens. So, you can deserialize an object from another assembly...unless that assembly has the other assembly loaded!
When the object is being deserialized in the first assembly, the type references a type in that assembly so it's not a problem. When the other assembly tries to do it, the assembly in which the Type is defined may not be loaded. To make sure it is, get the current AppDomain in your second assembly (the one having problems) and call AppDomain.Current.Load (several overloads, see MSDN docs for details). This should work okay then.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
Heath,
Thanks for your answer. However, it does not answer my question since I am not distributing the first assembly with the second. Both objects are the exact same, though (copy/paste).
Is there a way to "force" the deserialization even if the originating assembly is different?
Thank you!
Carl
|
|
|
|
|
If you can't include the assembly that has the type definition for the object you want to deserialize, you're either have to modify the string/binary data to change the assembly name (very dangerous!) or have a common library that defines that type that both assemblies you mentioned reference. The latter method would be much preferred.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
If I can't find a solution, I'm scared I will have to change the SOAP data in code... not very elegant but if it does the trick...
|
|
|
|
|
Again, I gave a solution that doesn't require changing SOAP: create a new library that contains the Type in question and use the Type out of that library in both assemblies that you mentioned earlier. That way both previously mentioned assemblies are independent of each other but share a common Type which both can serialize(/deserialize). This is an easy solution.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
Heath,
Thanks for your replies! I finally managed to make it work by reflecting all the properties of my class into a dataset and exporting the dataset to xml. This is powerful enough for my needs.
I have encapsulated everything pretty well and it works like a charm now!
Thanks again!
Carl
|
|
|
|
|
So now you take the most inefficient method for serializing an object? Seriously, it's not a hard solution and this is a typically problem that modular programming is meant to solve. Just put the Type in a different assembly that both the first and second assemblies reference. This is a proper solution and what libraries are meant to do.
You can do it the way you want, but it's terribly inefficient.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
Imagine that there are already some serialized objects and I want to change the namespace for an application. How can I do it? Is there a way to do that? I do not know how to exclude the namespace information while serializing or deserializing. Does anyone knows if it is also a subject in binary serialization.
|
|
|
|
|
It would have to, otherwise how would deserialization know which object to create to hold the following data?
This is not unfounded. Even in COM serialization (for instance, in compound documents format liks Word) the CLSID is stored for embedded objects so that they can be reconstituted, then they are handed various interfaces and perform their own persistence based on what interfaces they implement (and if the contianer application supports that persistence interface, like IPersistStorage ).
You could have a conversion program to upgrade your serialized data object, either by manipulating the data stream itself or using the Type in your old assembly with a similar Type in your new assembly (the common assembly) and deserialize the old Type, clone the data to the new Type, and serialize that.
Next time, you should be careful to design your assemblies in such a way that common functionality and types are in a common library, rather than duplicating such functionality and types in two different assemblies. As you can see, this is especially a problem when remoting.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
I found the solution and it solves lots of problems.
You are right. How would deserialization know which object to create to hold the data. So there must be a way to tell the deserialization which object to create. And there is such a way.
While deserializing it is trying to create the object in the serialized data. But I want to create my new object. So I wrote my special binder for my object.
public class SpecialBinder :
System.Runtime.Serialization.SerializationBinder {
public override Type BindToType(string assemblyName, string typeName)
{
MyObject obj=new MyObject();
return obj.GetType();
}
I binded my new binder object for deserialization. So I told the deserialization to create my new object. It may whether be under a new name space or even in a new assembly.
soapFormatter.Binder=new MyBinder();
MyObject obj=(MyObject)formatter.Deserialize(myStream);
What if there are multiple objects that are marked as serialized in the serialized object. At least now I wrote the solution. It should return all the classes that are serialized in the main serialized object.
public override Type BindToType(string assemblyName, string typeName)
{
MyObject1 obj1=new MyObject1();
MyObject2 obj2=new MyObject2();
MyObject3 obj3=new MyObject3();
if (typeName.IndexOf("MyObject1")>0){
return obj1.GetType();
}
if (typeName.IndexOf("MyObject2")>0){
return obj2.GetType();
}
if (typeName.IndexOf("MyObject3")>0){
return obj3.GetType();
}
return null;
}
This approach works in both binary and soap serialization.
I will try to write a generic approach. Then I can share it with you.
I know it is not a good idea to do such things but in my case I have to do that.
|
|
|
|
|
Hmm, I didn't know about the serialization binder. Very interesting.
And speaking of interesting serialization things, you should check out the ISerializationSurrogate . It won't help you, but it may come in handy for other things. Just thought I'd mention it.
One thing, though, I wouldn't return null from BindToType . Instead, you could return Type.GetType(string.Format("{0}, {1}", typeName, assemblyName) , or else nested objects or other objects won't be (de)serialized (unless returning null tells the serializer to use the actual type, but it's not documented and I don't feel like digging through the IL to find it! ).
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
I have a fairly simple C# app with tooltips on various controls. When I hide the form or minimize it, and then restore it... the tooltips stop working.
I've just gone to the extent of trying to remove and reset all of the tooltips in the form's StyleChanged and Activated events... but that didn't even work.
I've checked the Active property of the tooltip object, and it is always set to true.
Any ideas? This is really annoying!
Thanks,
Todd
|
|
|
|
|
Is this with the ToolTip provider in the .NET BCL?
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
Hopefully this is the right place to post this question. I am new to C# and am learning while developing some internal tools.
I have created a form which contains a Crystal Report Viewer on the form. I am then attaching a ReportClass object to it to display the report. This works as expected and my report is displayed.
ReportClass reportClass = new TasksReport();
reportClass.SetDataSource(dataSet);
crystalReportViewer.ReportSource = reportClass;
However, it takes some time (approx. 10-15 seconds) to process a DataSet which contains 4 related tables.
What I want to know is, is there a callback method or a event that I can use to display a "Progress Windows" or other on the screen while the report is being generated?
Thanks,
Trevor
|
|
|
|
|
The only event on ReportDocument is InitReport which fires when the report definition is loaded. I also didn't notice any private or internal methods or properties you could leverage through reflection when looking at the IL for that class.
At least make sure you show a wait cursor. A good way to do this is to save the current cursor and make sure that that cursor is restored - even in case of a failure:
Cursor old = Cursor.Current;
try
{
Cursor.Current = Cursors.WaitCursor;
}
finally
{
Cursor.Current = old;
old.Dispose();
} I know it's not what you want, but it at least informs the user that something's going on (which is part of the Windows UI guidelines anyway).
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|