i've created a little activeX dll under vb6 which i'm running under classic asp.
my question:
once the dll is compiled it has write-protection caused by the IIS (access denied).
i have to completely stop the webserver, then recompile + restart the server again.
is there a more convenient way to do this? maybe even without having to compile?
thx
No there isn't more convenient way. Once the DLL is loaded into memory by IIS it is locked and cannot be modified. You could write a simple VB script client in order to test the ActiveX without passing by IIS.
Related
My website application uses C# COM+ components running under a particular identity to access SQL Server, invoked from classic ASP.
There's also a web service that utilises a \bin DLL in the website application that contains a method to insert some data into the SQL Server database (let's call it MyApp.Database.dll).
From the website front end, I want to be able to provide authenticated users with this same functionality.
I don't want to duplicate code in MyApp.Database.dll within the COM+ component for obvious reasons.
My idea was to utilise the COM+ component from ASP to invoke the MyApp.Database.dll method to access the SQL database using the application credential since the ASP is running as the user and has no access to SQL Server.
Problem I've seem to run into is that although I can reference MyApp.Database.dll in my COM+ component project (under 'References' and 'using MyApp.Database.dll'), when it comes to actually running or debugging the COM+ component, when it tries to invoke the method from MyApp.Database.dll, it tells me 'Could not load files or assembly 'MyApp.Database, Version=3.3.3.11658, Culture=neutral, PublicKeyToken=.....' or one of its dependencies.'
The MyApp.Database.dll is not registered in GAC (trying to avoid this, it's also used by other applications as well), and hasn't had its codebase registered in the registry using regasm (I tried this and still didn't work). The version is correct, and I've placed MyApp.Database.dll in the application folder of the COM+ component.
Am I missing something or is it not possible to do this?
Thanks in advance for your help.
This is a common mistaken expectation: just because your .NET COM DLL was found in some given folder (the folder set by the /codebase argument or RegAsm) -- it doesn't mean .NET will look on that folder for anything else.
Generally speaking, it won't. Loading a .NET assemblies via COM interop is a special case. For everything else, assemblies will be loaded in the AppDomain based on the Fusion binding policy for the process - which has nothing to do with where your .NET COM DLL is. The process is actually (depending on your version of IIS) either dllhost.exe, iisexpress.exe or w3wp.exe.
You have a few options.
First, the obvious solution is putting MyApp.Database.dll in the GAC, since .NET always looks there. Sometimes that's the right choice (I've done that and it works). You have declined to do so and you have your reasons; that's Ok.
Second, I believe you can change the binding policy with a web.config file. See here: http://msdn.microsoft.com/en-us/library/823z9h8w(v=vs.110).aspx. Yes, your ASP Classic project can have a web.config. Obviously it has no effect on your ASP Classic scripts, but (depending on the version of IIS), .NET and/or IIS itself use it for configuration. I'm afraid that I can't help you much with this alternative because I've never had to try it before, but you're welcome to explore that option - let me know how it goes.
Third option - my personal choice: You said this DLL is already a web service, right? Just call the functionality with a web service call from your COM DLL. That doesn't require mucking with magic folders, GAC and binding policies. Much cleaner. The only mild complication is tracking in configuration where your web service is located - and I bet you already do that for your database connection anyway, so it shouldn't be hard to add.
If you are curious to know where .NET is looking for the DLL, read up on these guys:
How to enable assembly bind failure logging (Fusion) in .NET
http://www.hanselman.com/blog/BackToBasicsUsingFusionLogViewerToDebugObscureLoaderErrors.aspx
http://www.hanselman.com/blog/MoreOnAssemblyBindingStrongNamingTheGACPublisherPolicyAndDynamicallyLoadedAssemblies.aspx
Good luck, and please let us know what worked for you.
I have a very strange issue that i cannot figure out.
First i have a WCF service 4.0 done in VS2010.
the service have couple methods that return string array, datatable and such.
some of them use function from C++ dll throught [dllimport]
i made a test console to test everything. when i run the WCF from visual studio and use the generated path it works wonderfully.
now here is where it become strange. if i open my local IIS create a new application and point to my VS source code the WCF i can see it perfectly.
now using the http path from IIS local instead i refresh the methods all seems correct. But when i run my test app i can call any unction without any problem EXCEPT anyone using DLLIMPORT functions. they ALL crash and cannot trace even by tracing CES exceptions.
Doing line by line logging show that the exception is really on the call of those functions
the DLL in question is the same and the path is hardcoded for my computer since still in test phase and the folder is c:\DLL\mylib.DLL so nothing to do with shadow copy IIS/visual studio do when you actually run. also DLL reference by name withotu path even if it's in sys32 doesnt work.
Any clue ?
also. 32bit, changing app pool level right access on folder, full admin on machine already too. all tried but unsuccessful.
Edit: adding to all that since i haven't made this clear, it's not my first WCF real setup. i've already made alot of services before and deployed them myself (probably somewhere around 50-60 services). I am asking because i have never seen this issue before and i tried all tricks i knew and could find on the internet and resource people i know.
We have decided to incorporate the whole service in the WPF project locally since it work as long as IIS is not hosting. but this is really not a good thing as this data and work should NOT be done on client side but instead on server side. Right now it's fine since the software that need to use this is not released to public yet so it isn't critical.
Next option will be net TCP/IP windows service hosted on the web server if i don't find anything else.
We decided to go trough the trouble of having to hard code the logic in the main software and get away from web services for this issue. we will have to deal with updating, installing unregister and re register unmanaged DLL by hand somehow but at least it works.
we have added over 5 web services since that happen and no problem with them but again none of them use DLL imports.
I have a strange situation and I am unable to find a solution for this. I am working on a publically accessible Classic ASP site. I don't have access to the server or IIS but I have FTP access to it.
Now I want to reference a COM dll (not a .Net dll) to one of the asp pages. And then use it to create objects like:
Server.CreateObject(...)
I know about using RegSvr32 to register the dll or placing it into C:\Windows\system32, but I am unable to do so as I don't have access to the server.
I tried to place the dll with the asp file but it did not work.
Is there any other way to make it work?
I understand the situation, and have been there before.
However, there is no way (that I am aware of) to get it done that isn't related to a security/setup flaw that would make me want to change my hosting provider.
I finally got my localhost to display the site locally. Everything seems to be working on that end. My next step is to actually be able to step into the code from the VB6 IDE when the web site uses a function from the ActiveX.dll
UPDATE:
I updated the code and removed the issue I was having compiling the code.
Now when I try to debug the site won't open. It just hangs. I'm wondering are there any tutorials that I can read so figure out how to properly get this application setup for debugging?
UPDATE #2
Just to clarify, I got the web site (which references the ActiveX .dlls) locally on IIS 7.5. My hope is that when I open the site (on localhost) I can step through the .dll code at the same time.
That is really what I'm asking.
It's actually quite easy. First of all, do an iisreset. Then load up Visual Basic with your ActiveX DLL. Place your breakpoint, then Run your project.
Then hit your page containing a call to the ActiveX DLL and it should stop on a breakpoint you just set.
I wrote some WCF application.
I registered the application on the IIS.
The WCF application is build by using some dll that i wrote in the past.
I created reference to them and its seems that all work fine when i start the application thru the visual studio 2010.
But when i run it thru the IIS - i get message about some DLL that missing - even if the DLL it clearly in the project.
What i can do to fix it ?
I remove the reference - and load it again - and still nothing help.
Thanks for any help.
Is the DLL/Reference marked as Copy Always in properties? This will force the DLL to copy to the bin folder which IIS will require for a non-GAC'd assembly