Vista DLLImport Problem C# - c#

[DllImport("DoSomething.dll", EntryPoint = "something_dump", SetLastError = true)]
private static extern void something_dump(IntPtr dumper);
When I run this DLLImport on XP machines it works fine but on vista I recieve the exception:
Unable to load DLL 'DoSomething.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
On both machines its located in the Windows/System32 directory, but for some reason vista doesn't load it.
And when I fully qualify the path on the vista machine ...DllImport("C:\WINDOWS\system32\DoSomething.dll"... It works!
Do I actually have to tell the DLLImport function on the vista machine to look in the system32 directory?

The problem is someone was coping the dll to the current solutions output directory... The problem being they didn't copy the dll's dependencies to the output directory... So somehow XP could resolve those dependences and Vista would fail. (The dll is the exact same on both os’s)
Solution: Remove the coping of system dll's to the current solutions output directory...

Place you Dll into "document settings\administrator\" this path to work.
Make note you need to place all supporting files example .ino or .txt files support to that dll also.
It will work fine.
All the best.
Regards,
Prasath

Related

C# Dll import not working with some computers

I have a C++ dll compiled using VS2013.
I call it in my C# application like this :
[DllImport("myDLL.dll", EntryPoint = "RestartIfNecessary", CallingConvention = CallingConvention.Cdecl)]
public static extern bool RestartIfNecessary(uint uiAppId);
And it works fine.
However once the application is in prod some users have the following error :
Unable to load DLL 'myDLL.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
I can't find why this error happens on some computers. We've been able to fix the issue for some users by removing Microsoft Visual C++ 2013 Redistributable (x86) and (x64) and installing them again.
My C# application is compiled to run on x86.
I have a 64bits w10 and it works fine, so I don't know if it's related to windows.
Have you any hint to help me fixing this issue ?
EDIT: Here are the results of dependency walker :
In dependendy walker I've found 3 dll in red, I don't know if they are important:
API.dll is a third party dll (myDLL is a wrapper for this API)
The error means either myDLL.dll itself, or one of its dependent DLLs, cannot be found on the DLL search path.
Make sure myDLL.dll is placed where your app can find it. You can load myDLL.dll into Dependency Walker on the problematic computers to pinpoint any missing dependencies.

c# calling LoadLibrary from a 64-bit process to load a 64-bit library fails

I'm having a problem on a machine while attempting at loading a library with a P/Invoke call to LoadLibrary.
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr LoadLibrary(string dllToLoad);
This is my configuration. The calling assembly (A) is compiled in x64 and it calls another assembly (B) compiled as AnyCPU. From B I call LoadLibrary(dll_C_Path) to a library C that is 64-bit. All this works on my machine running Win10 64-bit, but it fails on another machine running Win7 64-bit with the following error (after calling GetLastError): "%1 is not a valid Win32 application".
On B, before calling LoadLibrary I've verified that Environment.Is64BitProcess=true. I've opened the library C with DependencyWalker and it appears 64-bit. But the most strange thing to me is that on one machine works while on another not. What can be the cause?
EDIT
I'm passing the full absolute path to LoadLibrary. Here below a screenshort from Depency Walker (library C is aec.dll). I'm not used to it, but one thing I noticed is that the msvcr120.dll, which aec.dll depends on, has not the icon of a 64-bit. Can this give some hint?
There are two possible explanations:
Your code finds a 32 bit DLL, or an otherwise invalid image. We don't know whether you rely of the DLL search path or specify an absolute path.
Your code finds a 64 bit DLL but when it resolves its dependencies, a 32 bit or otherwise invalid module is found.
You should do some debugging to work out what is wrong. I would write a simple C++ program to load the library and avoid the extra complexity of p/invoke. I'd use Dependency Viewer in profile mode to determine which dependency is not valid.

Native DLL Not found

I have a program that uses Tesseract to extract text from images. I made a Native C++ DLL that is used in C# via P/Invoke. My C# application is a console x64 based and the DLL is also 64 bit.
After deploying to a Windows Server I receive an error that suggets the DLL (one I've made) does not exists. The error message is below.
System.DllNotFoundException: Unable to load DLL 'TesseractX64.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E) at Utilities.Finance.PDFParser.PDF.OCRObject.GetUTF8Text(String path, String lang, String imgPath)
I know for sure that the DLL exists in that path. The TesseractX64.DLL is placed in the same folder as the C# application so it should work without any issues.
Here is my code:
[HandleProcessCorruptedStateExceptions]
[DllImport(#"TesseractX64.dll", EntryPoint = "GetUTF8Text", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr GetUTF8Text(string path, string lang, string imgPath);
What I have tried so far:
Set the DLLImport path to a relative path for example C:\DLL\Tesseract.DLL. Still same issue.
Installed Visual C++ 2005 - 2012 both x86 and x64. Still same issue.
It works perfectly fine on my Windows 7 x64 computer that I used to develop the program.
Either:
The DLL cannot be found, or
One of the DLL's dependencies cannot be found.
Place the DLL in the same directory as the executable to ensure that it can be found.
Make sure that all the DLL's dependencies are met on each machine that needs to run your software. That will involve first working out what those dependencies are. The documentation for the DLL should tell you that information. Typically this means installing the MSVC runtime against which the DLL was linked.
You aren't allowed to redistribute the debug runtime. You'll want to make a release build of the native DLL even if the .NET code is in debug mode.

Unable to load DLL in C#

how to load a dll in a c# project
error:
Unable to load DLL 'Reader.dll': The specified module could not be
found. (Exception from HRESULT: 0x8007007E)
code sample:
[DllImport("Reader.dll")]
public static extern byte OpenReader(ref IntPtr hCom, byte LinkType, string com_port);
image:
If the problem is really "cannot be found", then using ProcMon from Sysinternals will show you where the system is looking for the DLL.
However, often these sort of exceptions mean 'I found the DLL but I can't load it', and that can be because a dependency of the DLL is missing rather than the DLL itself, or because the DLL is incompatible with the app trying to load it. If your C# app is set for 'Any CPU' and you're on a 64bit machine, you'll get this sort of error loading unmanaged 32-bit DLLs.
One way to isolate the problem would be to create a simple C/C++ project which loads the DLL. (Load it dynamically with LoadLibrary if you don't have access to the import lib.) Then use Dependency Walker to profile the test harness, and it will report the names of missing DLLs.
Although the reader.dll is unable to load GPSVC.dll and IESHIMS.DLL.
i managed to make it work by running the corflags command on application.exe
the application is now marked as 32bit:
corflags application.exe /32bit+
Version : v4.0.30319
CLR Header: 2.5
PE : PE32
CorFlags : 3
ILONLY : 1
32BIT : 1
Signed : 0
I found this in another post. Maybe it will help your situation
NUnit "missing" GPSVC.DLL on Windows 7/64
If it's a simple C DLL it just needs to be in the same folder as the .exe.
For me the solution was to installing the C++ Redistrable X64 on client machine.
(Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019.)
The dll was already on the right place, in the same folder than the .exe file.
Here you found the download link:
https://support.microsoft.com/en-us/topic/the-latest-supported-visual-c-downloads-2647da03-1eea-4433-9aff-95f26a218cc0

When using pinvoke, what is the base path for a dll when only the dll name is provided?

I'm calling the following from c#:
[DllImport("u3dapi10.dll", CharSet=CharSet.Auto)]
public static extern uint dapiCreateSession(out uint hSession);
Where is .NET looking for the u3dapi10.dll file? This was working previously but now I'm getting a DLLNotFoundException.
The u3dapi10.dll file is in the root directory of the project. I tried copying it to the bin/debug directory just to see what happens, but it couldn't find it there either.
Possible cause:
Could this be caused by the u3dapi10.dll not being 64-bit compatible? e.g. Is a DllNotFoundException thrown if you try to access a 32-bit dll from a 64-bit machine? Or would it throw a BadImageFormatException as suggested by BadImageFormatException when loading 32 bit DLL, target is x86
See: Specify the search path for DllImport in .NET
and
http://msdn.microsoft.com/en-us/library/ms682586%28VS.85%29.aspx

Categories