P/Invoke in ASP.NET (Dll not found exception) - c#

I have a .dll that I generated thorugh a C++ project. I have to use this dll in my ASP.NET project and I have written DllImport functions for the same in my project.
The static class inside App_Code has some DllImport functions
public static class Functions
{
[DllImport("MyFav.dll", EntryPoint = "fnmain",
CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern StringBuilder fnmain();
}
Since I could not add the C++ dll directly as a reference in my ASP.NET project (because it is not a .NET assembly), I just copied into the top level directory. ( Name of ASP.NET Project-> Right Click -> Add Existing Item )
Now, when I try to run the project, I get the following error:
Exception:
Unable to load DLL 'MyFav.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
Any suggestions? Where has the .dll to be kept?

The .dll should be in the \bin folder of your asp.net application.
Apparently there are rules for how dlls are resolved. See Dynamic-Link Library Search Order on msdn
You could also try:
[DllImport("C:\path_to_dll\MyFav.dll", EntryPoint = "fnmain",
CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern StringBuilder fnmain();
If all this doesn't work, maybe your MyFav.dll has additional unresolved dependencies. You could use Dependency Walker to check for these.

I had a similar error, but using Mono's XSP server. For this server, the solution is to put the dll in the root of your web app (the parent folder of ./bin). That happens to also be the current working directory (when run from Xamarin Studio), which is presumaby related.

if to be used with out path copy paste the dll to bin directory in your project folder
.

Related

Dll is missing right after publishing it. .net WinForms

Where the files of published project will go after installing it ? I tried putting the DLL inside of the setup folder there yet it has still a same problem.
I'm trying to use the DLL using pinvoke
[DllImport("tc-b_new_sdk.dll", CallingConvention = CallingConvention.Cdecl)]
I receive this error:
System.DllNotFoundException:
Unable to load DLL 'tc-b_new_sdk.dll': The specified module could not be found.
(Exception from HRESULT: 0x8007007E)
Try adding Path of your DLL like this :
[DllImport("C:\Users\User\Desktop\tc-b_new_sdk.dll", CallingConvention = CallingConvention.Cdecl)]
Either the DLL itself, or one of its dependencies cannot be found.
If the DLL is in the same directory as the executable, this points to the issue being the dependencies. We can't know what the dependencies are. That information should have been supplied with the DLL. A common cause of this error is that your program isn't able to resolve a dependency on the MSVC to which the DLL is linked.

Unable to import c++ dll to c# project using DllImport

I'm trying to import a C++ Project Dll into a C# project. I found a lot of people talk about using DllImport. I tried using that and here is what I have-
CPP Code:
int __declspec(dllexport) beginCode(double reportId);
C# Code:
[DllImport("C:\\Users\\<my_user_id>\\Desktop\\ctxmix\\Release\\ctxmix.dll",CallingConvention =CallingConvention.Cdecl ,CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int beginCode(double reportId);
int result = beginCode(reportId);
But when I run, I'm getting an exception - Exception thrown:
System.DllNotFoundException
Do I have to add any references for the CPP Dll in the project or do anything else apart from the code which I have on the top?
Edit: I'm trying to run my .exe using VS2015 and I get this exception on my local machine. Also, I don't see my CPP Dll in the Project->References section where as I see other references there.
The unmanaged DLL needs to be locateable by your managed process. Typically that means placing the DLL in the same directory as the executable file. But you gave used an absolute path which I presume you transcribed correctly.
You may also encounter this error if the DLL's dependencies cannot be located. That seems the likely explanation here. Most likely the MSVC runtime cannot be located when your DLL is loaded.
Using an absolute path isn't a great idea. That will break down when you distribute to another machine. Use just the DLL file name and place it in the same directory as the executable.
Your DllImport attribute seems fussy. No point specifying CharSet when there is no text. I doubt your function calls SetLastError. And do you really need ExactSpelling?

Third party DLL not found C# ASP.NET MVC

So I have this code:
[DllImport("ECDM400Drv", EntryPoint = "ECDM400_Open", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern bool Open(byte PortNo);
And a dll file called ECDM400Drv.dll, which I placed in the root folder, src folder, and even the windows system32 and syswow64 folders just to be safe. I did this because I have another third party dll that I am using, which I had set up the same way and it worked, but when I do the set up with this dll, I get a dll not found exception, telling me it can't locate this file. I tried adding it as a project reference but that did not work either. Any help would be appreciated!
It could be permissions related. The following article has some good solutions that might help you: DllImport generates System.DllNotFoundException

Including DLL in C# Class Library

I want to reference/include and C++ dll file in to my C# class libary, with a normal C# windows form I just put the dll in the working directory, this does not seem to work for class libraries, how do I get it to find the .dll?
[System.Runtime.InteropServices.DllImportAttribute("ve.dll", EntryPoint=<MethodName>, CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl)]
That is the call to the methods and the DLL I am including is in the build folder.
You may need a post-build step to ensure that the DLL is copied to your build output folder when you recompile the application. Once that's done, the DLLImport attribute should be able to find the DLL using the short name of the file, without any path information (since it will be local to the executing assembly).
The c++ dll needs to be either local to the hosting exe (if the hosting exe references the c# dll it will copy that local to itself on build) or in a location in the system PATH environment variable.
You can add the c++ dll to the c# project (Add ->Existing Item -> All Files) and set Copy to Output Directory to Copy if newer or Copy Always and set Build Action to None (IIRC the default option)
If it isn't a managed DLL then you need to use the DllImport attribute. Assuming the DLL has exported functions. You can check the exported function names using dumpbin /exports
private const string DLLPATH = "MyDLL.dll";
[DllImport(DLLPATH, EntryPoint = "GetDLLStatus")]
public static extern int GetDLLStatus();
[DllImport(DLLPATH, EntryPoint = "SomeOtherFunction")]
public static extern float SomeOtherFunction();
DllImport will first look for the DLL in the application directory then look in your path

Unable to load Win32 Native DLL file from C#.NET

I have a C# winapp. I call a native .dll file (created in C++ by myself) from the C# app, and it works fine.
But when I copy my application (.exe and .dll files) to another machine, I get an error that says:
Unable to load DLL "c:\dllname.dll": The specified module could not be found. (Exception from HRESULT: 0x8007007E)
Here is the C# code:
class IsoMessageHelper
{
public const string ISO8583_DLL = "c:\\Hc8583.dll";
[DllImport(ISO8583_DLL, CallingConvention = CallingConvention.Cdecl)]
public static extern bool InitializationRq(...)
}
What should I do?
A common issue when deploying .Net applications that have native dependencies, is that the native dlls may be missing dependencies themselves on the target machines e.g. the correct version of the C runtime.
Use a tool such a Dependency Walker to analyze your native dll and determine if it has a missing dependency on the machine you have copied it too.
Try not to hard code any paths in the DllImport attribute parameter that specifies the name of the file. Then you should make usre the file is right besides the executable.
Something like this:
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
Move the DLL to the root. If that works, then look at your attribute to determine why. You haven't posted any code, so I can't give you any specific reason.

Categories

Resources