|
Hi,
I am writing a project that runs code from several assemblies.
Each assembly should be isolated, and the project supposes to be lightweight, therefore I am running one process and each assembly runs in a different AppDomain.
The project suppose that an assembly may crash or stack and uses the AppDomain.Unload() method to remove an AppDomain to release its resources.
I got to a problem once I tried to unload an AppDomain while a thread, that belonged to it, was waiting on a MessageQueue.Receive(). The AppDomain threw the CannotUnloadAppDomainException exception and didn't unload, or at least not gracefully.
The problem happens when a thread waits on a message queue and cannot be aborted, interrupted, or terminated forcefully. I didn’t try it, but I believe that the same happens when the thread waits for other things that use internally unmanaged code such as sockets.
How can I unload these AppDomains?
How can I force a thread to exit code that suppose to be managed such as MessageQueue.Receive() and Socket.Receive()?
Thanks,
Ami
|
|
|
|
|
When possible, set Thread.IsBackground to true on threads you create. See the .NET Framework SDK for more information about this property.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
It doesn't work, since the difference between foreground and background threads only affects the way the application exits, and not the way an AppDomain is unloaded.
MSDN: Thread.IsBackground : "A thread is either a background thread or a foreground thread. Background threads are identical to foreground threads, except that background threads do not prevent a process from terminating. Once all foreground threads belonging to a process have terminated, the common language runtime ends the process by invoking Abort on any background threads that are still alive."
What I want to do is to "kill" the AppDomain gracefully, without the need to do anything special within the AppDomain, and changing the way of threads creation is one of them.
I can't believe that I am the first person that gets to this problem. If you can’t “kill” an AppDomain then what is its advantage over a process?
|
|
|
|
|
Ami B. wrote:
I can't believe that I am the first person that gets to this problem. If you can’t “kill” an AppDomain then what is its advantage over a process?
You're probably not - try googling for others.
An AppDomain is an application boundary where assemblies are isolated from each other except through .NET Remoting and proprietary methods (sockets protocols, etc.). ASP.NET uses AppDomains so that when the Web.config file changes, an AppDomain is killed and new one respawned - all from another AppDomain started by the worker process. This allows the process to continue to run and an AppDomain to monitor the change status of the Web.config file so that it can respawn an AppDomain for the ASP.NET web site.
Executing threads must be aborted when the AppDomain needs to be unloaded. This may require changes in the assemblies you're loading, such as spawning threads for I/O, etc., or using async calls.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Very simple example of what I want to do.
I have a textbox on my form:
TextBox textBox1 = new TextBox();
I have a string containing the name of my textbox:
string strControlName = "textBox1";
I have a string that contains the text for my textbox to display:
string strControlText = "Hello World";
How do i use strControlName and strControlText to set my textbox's text property? (without looping through my controls on the form and using if statements).
In another language I know, you can use 'Indirection'. It's a very useful and powerful tool. This acts similar to the following:
set (@strControlName).Text = strControlText
where the end result is textBox1.Text = "Hello World".
I would love to be able to do this in C#! I was told to read up on reflection, but couldn't find what I wanted. Is there somehow a way to modify an existing control when all you know is the control name? (without looping through all the controls) Please help!
|
|
|
|
|
It depends - is the TextBox a field or property declared in your container (i.e., Form , UserControl , etc.) or is it simply a variable? Reflection only works on type metadata, so if it's a variable it won't work.
If it is a field, then you could do something like this:
public void SetText(string name, string text)
{
FieldInfo field = this.GetType().GetField(name);
if (field != null)
{
PropertyInfo prop = field.FieldType.GetProperty("Text");
if (prop != null && prop.CanWrite)
{
object obj = field.GetValue(this);
prop.SetValue(obj, text, null);
}
}
} This also works best when you don't specify the Name properties of controls, which isn't required (the designer does, though).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
the TextBox is an actual control that I placed on my form. Does that help?
I tried your code, but field is returned as null when I do the this.GetType().GetField(name).
|
|
|
|
|
That should be:
FieldInfo field this.GetType().GetField(name,
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); This will include non-public (i.e., private or protected) members in the search as well.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I think I understand what you're doing here, except for the last 2 lines. I don't have the object reference for my textbox. All i have is the name of the textbox. I need to be able to get this reference and set the text property on my textbox control.
|
|
|
|
|
Kasdoffe wrote:
I think I understand what you're doing here, except for the last 2 lines
Nevermind, I'm dumb
Anyways I got it to work like you showed except I had to add BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public as the second parameter to the GetField() method.
Thanks for your help! This is awesome!
|
|
|
|
|
I am not looking to create, rather I am more looking for advice on something to buy.
I would like to be able to scan in paper forms and use a tool to convert the image into a form that C# can use.
If such a tool does not exist, can you point me towards a tool that would build HTML or other interface from a paper form.
thanks
|
|
|
|
|
Anonymous wrote:
convert the image into a form that C# can use.
What do you mean by "use"? What do you want to do with the information off of the form? Are we talking about filling in items on a Windows Form or are you trying to do Windows Form layout?
I'm assuming layout since you mentioned
Anonymous wrote:
If such a tool does not exist, can you point me towards a tool that would build HTML or other interface from a paper form.
I've never heard of such a tool. And, frankly, can't image how something like this would even work considering the complexities of an HTML form that just can't be described by an image on a piece of paper.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
When I select some text in a RichTextBox, the control draws a filled blue rectangle around the selected characters. It appears that .NET doesn't allow this color to be changed. Is there a way to do this through either .NET calls or P/Invoke?
#include "witty_sig.h"
|
|
|
|
|
Take a look at the RichTextBox.SelectionColor property.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
That changes the color of the selected text, not the selection rectangle drawn by the control.
Is there a way to change the color used to highlight the text (i.e. the blue rectangle drawn over the selected text)?
#include "witty_sig.h"
|
|
|
|
|
Hi,
Can any one suggest me how to upload a file using MS SharePoint Portal Server(SPS) 2003 components (using web services for uploading and check in/out documents). Please provide me with the sample code if you have
Devikiran
|
|
|
|
|
Hi all,
I'm no database programmer, hence i don't need a "using" for "System.Data" so obviously i remove it at the start of the project both in the code and the reference section.
Why is it that everytime after that when i add a class to the project it gets re-referenced and put in the new class?
Is there anyway to configure what is included in the "using" section when a new class is auto generated?
Thanks in advance
|
|
|
|
|
Don't worry about it. If an assembly reference is not used when the project is compiled, it is not included as an assembly dependency in the generated assembly. You could, for example, add every single assembly on your machine as an assembly reference, compile your project, and still only the assemblies that are actually used will be referenced in the assembly manifest. The same goes for imported namespaces (which is really just a language feature that makes programming easier - it doesn't matter when linking the assembly).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I have been working on getting user control embedded in IE, unfortunately I have ben unsuccessful. So far I have written the control, replaced the system colors with standard colors (web colors black and silver). I have gone to the server and using the .NET wizards trusted the assembly, I have also tried using the configuration to trust the assemblies, I have signed the assemblies, and tried not signing. I have added full trust to the intranet (the control won't even load on the local machine). Here is a message I sent asking for help and the response I got (much appreciated by the way if you have any more ideas I'm all ears )
--------------
Hi, I've been trying to get my embedded user controls working for a couple days now and have not had any success. The problem I'm having is that instead of anything showing, I get the image loading icon in a recessed object. I have followed three tutorials including one from 4guysfromrolla, the .NET SDK sample, and your tutorial. I have even downloaded source of projects that definately work and have had the same results. Is there a setting on my server that I may have missed? I have included a screenshot of the results I get just to be clear on my error. I have also included the line from my logs that I recieve when someone accesses the page. Any advice you can offer would be much appreciated.
Either you haven't given that URL the necessary permissions using the Microsoft .NET Framework Configuration snap-in in the Control Panel->Administrative Tools (or use caspol.exe), or you're forgetting that system colors cannot be used by your control or any other controls within your control, and so on.
Code access permissions are important to remember. If you don't grant the necessary permissions based on the evidence (and only host evidence and the strong name evidence are gathered when embedded a control in IE), the control won't run. This is a "sandboxed" environment, remember.
The problem with system colors I've never been able to figure out, and despite my relationship with Microsoft no one there can give me a straight answer either.
--------------
Anyway, thanks in advance for anymore help that anyone can offer.
Yolan
|
|
|
|
|
The client has to trust the assembly, not the server. You must use the Microsoft .NET Framework Configuration MMC snap-in on the client machine to trust the URL of the assembly, or use caspol.exe (the command-line utility). The server doesn't need to trust the assembly - it's only hosting the control and not executing it. Assemblies need to be trusted on the machines on which they'll run.
As I mentioned in my email before, you should read Understanding .NET Code Access Security[^] for a better understanding.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I had also configured it locally to trust the dll(forgot to mention that, sorry). I used Runtime Security Policy->Machine->Code Groups->All_Code and added a new code group for my source. I used the full_trust option, but it still had no effect.
|
|
|
|
|
Yes, but which membership condition did you use? As I mentioned in my email, only host evidence and strong name evidence are supported by IEExec.exe, the runtime CLR host for Internet Explorer. Other evidence is not gathered.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I used strong name and URL. When I used strong name I used import to select the dll.
|
|
|
|
|
If you're using both membership conditions currently, only use one. I recommend the URL mebmership condition, using an asterisk (like http://www.mydomain.com/dir1/*) if your assembly depends on other assemblies located in the same directory).
Also, make sure you go through every single Color property in your entire control - not just the control itself, and make sure you're not using system colors.
Other than that, I don't know what to tell you. I've embedded many user controls this way as have other people.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hi!
I am doing an innovative P2P app in C# with .NET 1.1
The Peer I'm working on has a few threads to manage the I/O.
The Peer has the port number 11 000 to listen for request.
This port is manage by code that is used as -pardon my my analogy!- a pimp for incoming requests.
When another Peer(client) connects to your Peer(server), it connects to port 11000 and ask
the pimp for a socket to pursue communication. The pimp sends back a socket number and
tell another part of the p2p app -the bookie- to create the port and wait the client.
Now, the problem is very simple
The bookie is high, and he does not creat and open the right port -he uses a ramdom one apparently!
Right now the code for the client and the server is running on the same machine.
So my question is: How can I have the bookie create the port that the pimp asked him for ????
Thank!
ps.: sorrhy for the bad analogies :they work
|
|
|
|