|
I hope someone has encountered this situation before because we are stumped!!
Situation:
We have a fat client application which remotes to an object manager under IIS.
The remoting has been working just fine for the entire year and then we went and 'fixed' things.
We moved our application DLL's into a subdirectory beneath the applications' bin directory.
We added a <runtime> division to the web.config which defined a <probing privatePath="bin; bin\OurDir">.
This is getting recognized by ISS but when it attempts to load my DLL I get this dump message:
System.IO.FileNotFoundException: File or assembly name remoteManagers, or one of its dependencies, was not found.
File name: "remoteManagers"
at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Boolean isStringized, Evidence assemblySecurity, Boolean throwOnFileNotFound, Assembly locationHint, StackCrawlMark& stackMark)
at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Boolean stringized, Evidence assemblySecurity, StackCrawlMark& stackMark)
at System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark)
at System.Reflection.Assembly.Load(String assemblyString)
at System.Runtime.Remoting.RemotingConfigInfo.LoadType(String typeName, String assemblyName)
at System.Runtime.Remoting.RemotingConfigInfo.GetServerTypeForUri(String URI)
at System.Runtime.Remoting.RemotingConfigHandler.GetServerTypeForUri(String URI)
at System.Runtime.Remoting.RemotingServices.GetServerTypeForUri(String URI)
at System.Runtime.Remoting.Channels.Http.HttpRemotingHandler.CanServiceRequest(HttpContext context)
at System.Runtime.Remoting.Channels.Http.HttpRemotingHandler.InternalProcessRequest(HttpContext context)
=== Pre-bind state information ===
LOG: DisplayName = remoteManagers
(Partial)
LOG: Appbase = file:LOG: Initial PrivatePath = bin
Calling assembly : (Unknown).
===
LOG: Private path hint found in configuration file: bin; bin\TCANavigator.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Post-policy reference: remoteManagers
Does ANYONE have a suggestion of how to get rid of this short of moving everything back into the \bin directory????
Thanks!
This signature left intentionally blank
|
|
|
|
|
Get rid of the space in your privatePath . Directories should only be delimited by semi-colons and nothing else.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles]
|
|
|
|
|
Heath,
I checked my source and the actual web.config does not have a space in the privatePath definition. It was just a bad typing into the message on my part. Any other ideas (hopefully as simple!!).
Actual web.config statement:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin\TCANavigator"/>
</assemblyBinding>
</runtime>
Michael
This signature left intentionally blank
|
|
|
|
|
So long as that's the case (because spaces will cause problems - I've tested it), then it's possible your permissions on the TCANavigator directory aren't correct. Remember that the file system permissions must allow the ASP.NET account (ASPNET by default) read, list, and execute permissions, while IIS must allow access to the directory for the ASP.NET account.
You might also consider installing your assemblies into the GAC. This is how SharePoint works, along with other larger ASP.NET web application (with larger commercial deployment), because the GAC facilitates side-by-side versioning, assembly redirection, and more; not to mention the fact that you don't have to worry about having separate copies of the same assembly lying around in different ASP.NET web applications.
Installing your assemblies into the GAC would definitely solve your immediate problem.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles]
|
|
|
|
|
Heath,
We are starting to see a "creaping" behaviour with this problem. ie. One machine works fine today then fails tomorrow. Since we are seeing impacts in other applications, I suspect that it is due to the 1.0 / 1.1 framework security patches. (it is getting out slowly to different machines)
The directories (bin and subdir's) all have the same attributes for access rights. Adding Read or Execute does not change the fault occuring. I really think it is specific to the log events that occur.
1) attempts to locate the DLL in the bin directory with partial name.
Not Found.
2) goes to the subdirectory with a partial name and finds it.
3) Framework reports I don't have rights to load by partial name (????)
4) System.IO.FileNotFound
The change in doing a partial name Assembly load is what is killing me. Seems I can do it in \bin but not in any deeper directory without creating some kind of framework permission.
This signature left intentionally blank
|
|
|
|
|
I'm not aware of any such change of the top of my head, but a good place to start researching the problem is http://msdn.microsoft.com/netframework/[^].
To solve the problem without checking for security changes (which I'll do as soon as the page linked from above loads , you can either use a fully-qualified name or qualify the name in the .config to allow for partial name resolution in cases like this. Read about the <qualifyAssembly> Element[^] in the .NET Framework SDK.
...man, this is loading really slow today...
Okay, the following are the links about the changes made in the service packs:- List of bugs that are fixed in the .NET Framework 1.1 Service Pack 1 (SP1)[^]
- List of bugs that are fixed in Microsoft .NET Framework 1.0 Service Pack 3[^]
Unfortunately I don't see anything relevent to your problem, but you might take a second look.
Make sure the resolution above works and determine if the existence of the SP is truly the cause here (it works without; doesn't work with the SP installed). There could be an issue there (be sure to let me know).
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles]
|
|
|
|
|
The most common solution is to use a Timer . Since you're using Windows forms, just drop the Timer component on your form and double-click to add an event handler for the Timer.Tick event.
The following sample shows how you should change your current code, as well as what code you should add:
public MyClass()
{
InitializeComponent();
timer1.Interval = SystemInformation + SystemInformation.DoubleClickTime + 10;
}
private void ClickHandler()
{
}
private listView1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
}
private listView1_DoubleClick(object sender, EventArgs e)
{
timer1.Enabled = false;
}
private timer1_Tick(object sender, EventHandler e)
{
timer1.Enabled = false;
ClickHandler();
} It's a simplified example, but it shows the basics of using a timer to distinguish between clicks and double clicks. There are other ways, but using timers is quite simple.
Also note that the .NET BCL (base class library) provides three different Timer classes. You might want to evaluate which one works best for you.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles]
|
|
|
|
|
Thanks for the reply
Can you please briefly explain other options too..
I might have to do this in MFC also
thanks once again..
Sandeep Naik
|
|
|
|
|
Using timers in C/C++ (upon which MFC is written) to distinguish between clicks and double clicks is the most common scenario as well.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles]
|
|
|
|
|
Thanks a lot....
I could solve the problem
Sandeep Naik
|
|
|
|
|
Hi,
I'm trying to write a class which provides access to several collections. Business requires, that the user of my class might access the collections content (the objects stored in it) without allowing him to modify the collection itself, that is, he can enumerate the objects, access call methods / access properties, but can't add or remove objects to or from the collection.
I hope I got the question clear enough to understand
What is the best way of designing this?
Thanks in advance!
Matthias
If eell I ,nust draw to your atenttion to het fakt that I can splel perfrectly well - i;ts my typeying that sukcs.
(Lounge/David Wulff)
|
|
|
|
|
Extend whatever IList implementation you want (or just implement it yourself, or extend CollectionBase ) and override IsReadOnly . Define a method that sets a state variable and can never set it again like so:
public class ReadOnlyArrayList
{
bool readOnly;
public override bool IsReadOnly
{
get { return readOnly; }
}
internal void SetReadOnly()
{
readOnly = true;
}
} And there you go. Once you've filled it with the objects you want in the list, call SetReadOnly . ArrayList , along with other IList implementations in the BCL, check IsReadOnly before allowing changes using methods like Add or Remove . If you implement IList yourself, make sure you do the same.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles]
|
|
|
|
|
If you have methods returning ArrayList and you don't want the consumer of the list to modify it, you can use ArrayList.ReadOnly(collection) method.
For example if you have internal:
ArrayList myList;
and method returning this list:
ArrayList GetMyList()
{
return ArrayList.ReadOnly(myList);
}
that way they will get ArrayList with all elements of your list. However if you internally change content of the list inside your class, then those changes will be reflected in the returned list (if someone is pointing reference to it).
Hope this makes sense.
|
|
|
|
|
I am handling OnClik and OnDoubleClick event on a listView. When ever user doubleclicks on a item, first OnClick and then OnDoubleClick event gets fired. Is there a way to avoid OnClick event when user has DoubleClicked on the item ?
Sandeep Naik
|
|
|
|
|
1. my vendor interface is defined in an h & c file:
_EXTERN S16BIT _DECL aceSetIrqConditions(S16BIT DevNum, U16BIT bEnable,
U32BIT dwIrqMask,void(_DECL *funcExternalIsr)(S16BIT DevNum, U32BIT
dwIrqStatus))
void _DECL Callback(S16BIT DevNum, U32BIT dwIrqStatus);
/* Configure user callback ISR and enable EOM interrupts */
aceSetIrqConditions(DevNum, TRUE, ACE_IMR1_BC_MSG_EOM, Callback);
void _DECL Callback(S16BIT DevNum, U32BIT dwIrqStatus)
{
/* this is what I would write, I would like to get here with C#
}
2. I am trying to use the vendor interface for the above
aceSetIrqConditions() to call an interrup routine I write (eomInterrupt).
This is my C# effort, it compiles, but when I try to execute this, I get an
Error, see below:
// EOM Interrupt declaration
public delegate void Callback(short DevNum, uint dwIrqStatus);
[DllImport("C:\\acs\\bin\\Release\\emace_32.dll")]
public extern static short aceSetIrqConditions(short DevNum, ushort bEnable,
uint dwIrqMask, Callback cbm);
Callback cbm = new Callback(eomInterrupt);
aceSetIrqConditions(devNum, 1, ACS1553.ACE_IMR1_BC_MSG_EOM, cbm);
public void eomInterrupt(short DevNum, uint dwIrqStatus)
{
/* *** never gets to statement below! *** */
if((dwIrqStatus & ACS1553.ACE_IMR1_BC_MSG_EOM) != 0)
{
irqCount++;
}
}
The error is:
Debug Error!
File:i386\chkesp.c, Line 42.
The value of ESP was not properly saved across a function call. This is
usually a result of calling a function declared with one calling convention
with a function pointer declared with a different calling convention.
The program runs fine, except when I added above. What am I doing wrong???
Thanks,
--
Evelyne
Expand AllCollapse All
Evelyne S. Mitchell
|
|
|
|
|
First, if possible NEVER hard-code the path to the DLL from which you want ot P/Invoke functions. If necessary, add the path to the PATH environment variable and restart the application. If you hard-code the path, you're only in for a world of maintanance nightmares.
Also, if you haven't already read Consuming Unmanaged DLL Functions[^] and Marshaling Data with Platform Invoke[^], but you seem to have a good grasp of P/Invoke.
As far as the calling convention problem, we have discussed this before and it is a known problem. To better help you, though, what exactly is _DECL defined as?
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles]
|
|
|
|
|
Heath, Thanks for answering.
Why did my first reply not appear on the message board?
I don't know what _DECL is defined as.
Here are some applicable snippets from the vendor example, coded in c:
#ifdef WIN32 #include #include "stdemace.h" #include #endif
...
void _DECL Callback(S16BIT DevNum, U32BIT dwIrqStatus);
...
/* somewhere in their main, the conditions to call the user interrupt routine are set up */
/* Configure user callback ISR and enable EOM interrupts */ aceSetIrqConditions(DevNum, TRUE, ACE_IMR1_BC_MSG_EOM, Callback);
...
/* this is what I would write in C# */
/* can I define a C# method by assigning a calling convention of Cdecl? How do I do that? Where do I put the statement CallingConvention=CallingConvention.Cdecl? By the way this is just an idea!?! */
void _DECL Callback(S16BIT DevNum, U32BIT dwIrqStatus)
{
/* confirm that IRQ is ACE_IMR1_BC_MSG_EOM */
if(dwIrqStatus & ACE_IMR1_BC_MSG_EOM )
{
nNumIrqcounter++;
// todo: perform additional message processing
}
}
I hope this helps?
Evelyne S. Mitchell
|
|
|
|
|
Evelyne wrote:
Why did my first reply not appear on the message board?
You hit the "Email" link instead of "Reply".
It's important to know what _DECL is defined as because that's obviously defining your calling convention.
You could just assume it uses the __cdecl calling convention and add the CallingConvention.Cdecl to your DllImportAttribute :
[DllImport("emace_32.dll", CallingConvention=CallingConvention.Cdecl)]
static extern short aceSetIrqConditions(short DevNum, ushort bEnable,
uint dwIrqMask, Callback funcExternalIsr);
delegate void Callback(short DevNum, uint dwIrqStatus); Unfortunately, that won't solve your immediate problem. Delegates use the __stdcall calling convention and you can't change this directly in C#. You have to do one of the follow:- Change your native DLL to use the
__stdcall calling convention (probably can't since this sounds like it's from another vendor) - Write a Managed C++ assembly that wraps this functionality. Since it targets the CLR and follows the CLI (mostly) you can use it in other managed languages like C#, VB.NET, etc.
- Disassemble our assembly, change the calling convention, and reassemble your assembly.
For the last one, write your code and compile your project. Run ildasm.exe <MyProject.exe> to disassemble it. Find the declaration of your callback and add the following between the return type and the name Invoke defined for the delegate:
modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) Now reassemble using ilasm.exe (notice no "d"). You will want to read about this tool in the .NET Framework SDK before running it to make sure your assembly gets resigned correctly, and you really should sign your assemblies (and version them) to produce a strong name assembly. Not doing that leads to security problems and makes upgrades and .NET code access security a pain. Frankly, it's easy. Just run sn.exe -k <filename> to generate a key pair and set the path in your AssemblyInfo.cs (by default using VS.NET) file's [assembly: AssemblyKeyFile("")] attribute, or add it to a container using sn.exe -i and use the AssemblyKeyNameAttribute instead.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles]
|
|
|
|
|
Heath,
I tried to take your option 1 first, sounded less complicated. So I contacted the vendor and here is what they said:"The calling convention of the callback routine for the user interrupt is not _cdecl. The callback is defined to be _DECL which we have #defined in our code to be WINAPI. In the Windows files WINAPI is defined to be the standard calling convention. From Windef.h which is a Windows header file: #define WINAPI __stdcall."
So by not defining the calling option of CallingConvention=CallingConvention.Cdecl, that should have worked to begin with? So what do I doe now, I am really confused???
Evelyne S. Mitchell
|
|
|
|
|
Thought I would update you. I was out of commission over the weekend because of Hurricane Jeanne, no power, no work on Monday.
I have changed my code to the following (yes, I still have the absolute path in here!) and I do get to my interrupt routine now:
public delegate void Callback(short DevNum, uint dwIrqStatus);
public static Callback cbm = new Callback(eomInterrupt);
[DllImport("C:\\acs\\bin\\Release\\emace_32.dll",CallingConvention=CallingConvention.StdCall)]
public static extern short aceSetIrqConditions(short DevNum, ushort bEnable, uint dwIrqMask, Callback cbm);
public static void eomInterrupt(short DevNum, uint dwIrqStatus)
{
/* confirm that IRQ is ACE_IMR1_BC_MSG_EOM */
if((dwIrqStatus & ACS1553.ACE_IMR1_BC_MSG_EOM) != 0)
{
irqCount++;
}
}
Thanks for your help,
Evelyne S. Mitchell
|
|
|
|
|
Hi,
I have a problem, I want to check a data is entered to SQL database or not. I am making this in PHP like below:
<br />
$sql_name_check = mysql_query("SELECT name FROM names WHERE name='$buffer_name'");<br />
if(!mysql_num_rows($sql_name_check)){<br />
}<br />
So I want to do that in C# so I made a code block which is below:
<br />
int k=0;<br />
string buffer_name = "Cem Louis";<br />
SqlConnection mySqlConnection = new SqlConnection("Initial Catalog=names;Data Source=localhost;Integrated Security=SSPI;");<br />
SqlCommand mySqlCommand = mySqlConnection.CreateCommand();<br />
mySqlCommand.CommandText = "SELECT name, tel FROM names WHERE tel = '1' AND name = name";<br />
mySqlConnection.Open();<br />
SqlDataReader mySqlDataReader3 = mySqlCommand.ExecuteReader();<br />
while(mySqlDataReader3.Read())<br />
{<br />
k++;<br />
}<br />
if(k > 0)<br />
return false;<br />
else<br />
return true;<br />
mySqlDataReader3.Close();<br />
mySqlConnection.Close();<br />
Thank you;
Cem Louis...
|
|
|
|
|
|
And my question is:
How can I know that the SQL query returns a result? Is the cell filled with data??? The C# code that I wrote above is not doing this with variable k++ increment...
Thanks...
|
|
|
|
|
If you have any rows returned SqlDataReader has property HasRows
SO you can do:
if (reader.HasRows)
{
// something returned
}
|
|
|
|
|
hmm HasRows...
Thank you...
|
|
|
|
|