|
my guess would be that this is caused by having events in your object. If anything is hooked up to the event by the client then there would be a refernce to the app in the serialized object.
the following code worked for me a while back when i had a similar problem:
[field:NonSerialized()]
public event EventHandler thisEvent;
[field:NonSerialized()]
public event EventHandler thatEvent;
hope this helps
Russ
|
|
|
|
|
Well, Russ,
I dont have any events in my custom objects. They contain data members only.
Thanx for your reply.
Regards
Khalid
|
|
|
|
|
i just reread your OP,
it sounds like you've got a copy of the class referenced, not the same class. If you put the class in a dll which you ship to the client and the server then this should work. The code will owly have matching versions if it is the same dll on both client and server
hth
Russ
|
|
|
|
|
Hiya,
This sounds like the server is expecting to deserialise an object it thinks is in the assembly 'Client.exe'. (due to the containing assembly information being serialised too, and .NET considering the server object and client object to be different things). Ultimately, if your application exists in two parts and you are sharing serialised objects between the two, there needs to be some class reuse here.
It seems to me that you can either get this reuse by combining the source file in both assemblies, or build an intermediate assembly as you say.
I would argue that the latter is the correct way to go. If the objects reside in a third assembly then you can use assembly versioning to ensure that both client and server are singing from the same songsheet; you don't get this by sharing the source. By sharing the source it also means that if you change the server you would need to recompile the client. Sharing the source also creates a grubbier solution. True, if someone tampers with your dll then you're stuck - but this is the case for all assemblies. I think the consistency check you mention would in effect be done by .NET for you.
Just an opinion....
Regards,
Rob Philpott.
|
|
|
|
|
luckykhalid wrote: Another solution to this problem is that I make a separate .dll for all my custom objects that need to be communicated between server/client and place the same copy of that dll at both the sides.
This is exactly the "typical" solution. BTW, take a look at what the BinaryFormatter is producing. It's slow, and it's a hog. As someone else posted to a question I was asking, a "bool" (one byte) takes 256 bytes when BinaryFormat'ted.
If you can at all avoid the BinaryFormatter, do so. It's intended for reflection deserialization, thus it retains type and version information, which is why you are getting your problem.
If you are simply serializing native types, like ints, strings, etc., I would suggest writing your own serialization. I have RawSerializer class that I've written, that will eventually become an article. If you're interested, send me an email and I'll send you the code. It also handles structs like Guid, DateTime, and your own structs, as long as the contents are native types.
Marc
VS2005 Tips & Tricks -- contributions welcome!
|
|
|
|
|
i everyone,
I have a need where I have to get a reference to a control running in another application (in a different process) through its handle.
.NET has this nice method where you can get a control from its handle:
Example:
Control con = Control.FromHandle(controlHandle);
It's nice but it only works on the controls that are within your own process space. Now, I am wondering if there is a way that I can run my application in the other application's process or there is a way that I can inject my code into that process.
I would really grateful for any help that you can give me!
Cheers,
Keith
|
|
|
|
|
Hi:
I have an application with a GUI that drives a math simulation. The simulation would run in about 10 min during which the GUI would go white and be unresponsive.
To fix that unresponsive behavior, I put the math simulation call in a separate thread. Now the GUI is responsive, but the simulation takes 1 hour to run. I have tried fiddling with the threadpriority of both the simulation thread and the GUI thread, but have seen little change. I am about to give up on the threading since I cant afford the 1 hr sim time to get the responsive GUI.
Have any of you seen this problem, and could you suggest any way to make threads work without costing so much execution time?
Thanks, Sam
|
|
|
|
|
Are you continously acessing the user interface from your worker thread? If you are reading values or writing to controls in the UI from a worker thread, those calls will take longer when properly marshaled. Make sure your worker thread has a local copy of data to work with and only synchronizes with the UI thread every once in a while.
I'm just guessing here. You can get a profiler or write some logging statements to see what operations are now taking longer.
I can imagine the sinking feeling one would have after ordering my book,
only to find a laughably ridiculous theory with demented logic once the book arrives - Mark McCutcheon
|
|
|
|
|
The worker thread has its local copy of the GUI fields - these are set at the initiation of the simulation. Thanks for the suggestion however.
|
|
|
|
|
That's a tough one. There has to be some sort of hidden synchronization cost that you are missing. As long as you are only transfering simple datatypes there shouldn't be any. One way to see if there is a lot of syncronization is to open performance monitor and see if the number of context switches goes way up when you start your thread.
Also, just to make sure, we are only talking about 1 worker thread. Running more then a few active threads at once is a really good way to slow a system down to a crawl.
I can imagine the sinking feeling one would have after ordering my book,
only to find a laughably ridiculous theory with demented logic once the book arrives - Mark McCutcheon
|
|
|
|
|
This is what you do
Create a button on your form that when clicked starts a thread that runs the simulation.
And WOLA!!!!!
Please understand the pseudo code below
Button1_ClickEvent()
{
Thread t = new Thread(new ThreadStart(StartSimulation));
t.IsBackground = "true";
t.Start;
}
The thread will start and return back to your form waiting for another event
In the meantime your thread is running in the background.
Be sure to put a Thread.Sleep(1000) some where in your simulation method if your running a
continous loop. That will free up some of the hogging of the cpu processor.
Allowing other threads time to do something... this may be causing your laggggg....
This is a simple work around approach...
Ya get my drift???
Kourvoisier
-- modified at 16:37 Tuesday 15th November, 2005
|
|
|
|
|
Have you even tried to understand what he meant?
He said that is simulation thread is taking too long and you really suggest putting some Sleep statements into it?
Besides that you have four errors in your few lines of sample code.
|
|
|
|
|
Yes you are right, i did not understand what he meant now i do....
please disregard my post. As i thought your form was not loading at all when you started your thread.
But my code on the other hand was really meant to be pseudo code not to be followed
by the syntax...
you get the point i was making in the code...
Smart guy!!!
Kourvoisier
|
|
|
|
|
I prefer using Delegate.BeginInvoke myself, since the syntax is more natural and it returns a syncronization object so you don't have to manage it yourself.
I can imagine the sinking feeling one would have after ordering my book,
only to find a laughably ridiculous theory with demented logic once the book arrives - Mark McCutcheon
|
|
|
|
|
I do not seem to understand how events work in C#. I'm trying to write a sockets class that will fire off and event when the connection is made and or dropped. So I have a class call CMySocket.
In the namespace MySocket (outside of the class) I have my delegates
<br />
public delegate void OnConnectHandler(CMySocket sender, EventArgs e);<br />
public delegate void OnDisconnectHandler(CMySocket sender,EventArgs e);<br />
In the class I have the event handlers
<br />
public event OnConnectHandler OnConnected;<br />
public event OnDisconnectHandler OnDisconnected;<br />
I have a method called Connect()
<br />
public void Connect()<br />
{<br />
m_socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);<br />
IPEndPoint ipend = new IPEndPoint(Dns.Resolve(sIPaddress).AddressList[0],nPort);<br />
m_socketClient.Connect((EndPoint)ipend);<br />
if (OnConnected != null) OnConnected(this, new EventArgs());<br />
}<br />
In my form class I have a method
<br />
public void OnConnected(CMySocket mySocket, EventArgs e)<br />
{<br />
MessageBox.Show("Connected");<br />
}<br />
But this method is never called from the event. What am I doing wrong. I thought I was following the tutorials correctly can some one please help
Thanks
Tom Wright
tawright915@yahoo.com
|
|
|
|
|
hoping i've understood you right.
just after the point where you create a new socket, you need to add some code like mySocket.OnConnected+= new OnConnectHandler(mySocket_OnConnected)
then replace the OnConnected function with:
public void mySocket_OnConnected(object sender, EventArgs e)
{
//some stuff
}
i've been doing something similar recently and had problems with events being raised on the wrong threads, if you get threading messages you'll need to look up BeginInvoke()
hth
Russ
|
|
|
|
|
I have two classes one for the form called form1 and one for the socket called CMySocket
Are you saying that I need to add this to the form1 class or the CMYsocket class?
Tom Wright
tawright915@yahoo.com
|
|
|
|
|
Never mind I figured it out. So how did you raise your event for the disconnect? Did you do it when you tried to recieve data and got back a socket error?
I have to admit that events on sockets in MFC are a lot easier.
Thanks
Tom Wright
tawright915@yahoo.com
|
|
|
|
|
Hi im jus wondering if anyone knows anyway to change the layout of a datagrid. at the moment im returning rows from the database and displaying the column names across the top like normal but im just wondering if anyone knows how to display the columns down the side of the datagrid. Thanks in advance
|
|
|
|
|
I don't know how you'd do it with a standard grid, but Developer Express[^] have a Vertical Grid component, if that's any help.
|
|
|
|
|
Hi buddies,
Suppose we have created an AppDomain with FriendlyName "NewDomain" in the current AppDomain named "CurrentDomain" and have created an instance of class A in that, now we call some method of that instance, Here is the code:
AppDomainSetup domainSetup = new AppDomainSetup();
domainSetup.ApplicationBase = @"c:\myApp";
domainSetup.ShadowCopyDirectories = @"c:\myApp";
domainSetup.LoaderOptimization = LoaderOptimization.SingleDomain;
AppDomain appDomain = AppDomain.CreateDomain("NewDomain", null, domainSetup);
// Here the constructor is called in the 'NewDomain' domain
A obj = (A)appDomain.CreateInstanceAndUnwrap(assemblyName, "A");
// Here the 'MyMethod' is called in the current application domain
obj.MyMethod();
While tracing "AppDomain.CurrentDomain.FriendlyName" in class A, I see:
1. In its constructor scope, it is "NewDomain", that is ok
2. In the called method scope, it is "CurrentDomain".
It means that the method is called in the 'CurrentDomain', while I wana the method be called in the "NewDomain" application domain.
How can I perform it ?
Thanks
---
"Art happens when you least expect it."
|
|
|
|
|
Make sure that A derives from MarshalByRefObject and isn't just serializable.
I can imagine the sinking feeling one would have after ordering my book,
only to find a laughably ridiculous theory with demented logic once the book arrives - Mark McCutcheon
|
|
|
|
|
Yes, that solved it,
Thank you Andy very much
---
"Art happens when you least expect it."
|
|
|
|
|
Hi,
After filling a dataset I would like to further filter the results without repopulating the dataset. Any help would be appreciated.
"She folds her legs...in doing so I glimpse Xanadu."--Gilby
|
|
|
|
|
Hello All,
I developed a Com+ Application it will work in the clients machin and do some work in the SQL Server. this SQL server inside a DMZ.
the problem is the component in the clients can reach the SQL Server to do the work. how can i solve this problem
Please help
Hoho
|
|
|
|