System.BadImageFormatException: 'Could not load file or assembly' - C# / C++ - c#

I try to be as detailed as possible in explaining our situation, premising that we made several attempts in relation to other similar situations found on stackoverflow. Specifically, we have a project consisting of many libraries in c# that has been updated from net 4.7 to asp.netcore 6.0. Within the project there is also a library of classes in c++. This library generates a dll that is used within one of the projects c#. The project in c++ has not been updated, but we simply went to vary the target framework from net 4.7 to netcore 6.0 (and also we changed clr to clr:netcore) as explained in the Microsost guide for porting hybrid projects in C# and C++. All the project builds correctly but when the debugging of the webapp in C# referencing the dll in C++ I get the following error:
System.BadImageFormatException: 'Could not load file or assembly 'Tradante.MT4.Wrapper, Version=1.0.8369.22669, Culture=neutral, PublicKeyToken=null'. Format of the executable (.exe) or library (.dll) is invalid.'
Navigating through various issues similar to our case, we seemed to understand that the incompatibility problem could be related to having a project at x64 and another at x86. We tried to vary all possible combinations but the error remains the same. But we noticed something strange: we forced the build to x64 of the webapp in C# but in the compilation output (which we see as enabled debugging of the native code) we find the name of the webapp followed by (Win32) as if the machine continues to build at x86. I don’t know if this information can help you.

Related

Converting a WinForms Library from Net. Framework to Net. Core results in an error: Failed to load assembly

I have an WinForms Library with runtime and design-time assemblies.
In Net. Framework 4.7 it work perfectly well.
When I converted the library to Net. Core 6 the design-time part has stopped working
with a error
Failed to load assembly: EhLib.WinForms.Design.dll
I can't understand why.
The EhLib.WinForms.Design.dll file is present in the WinFormsApp1\bin\Debug\net6.0-windows project folder.
EhLib.WinForms.Design.dll is located in the \bin\Debug\net6.0-windows\ folder for each project.
When debugging DesignToolsServer.exe, you can see that the studio is loading this assembly.

Can't build Excel VSTO Add-In: "An attempt was made to load a program with an incorrect format" for winmd files

I am unable to build a project targeting .NET Framework 4.7.2. Specifically, this is an Excel VSTO Add-In using a ClickOnce deployment.
I am using Visual Studio 2019. The add-in has a working code base, but previously it was targeting earlier .NET versions (4.0, 4.5). Changes in some of the dependencies and the web services they interact with mean that some libraries used needed to be upgraded to later versions, and so some dependency shuffling got me in this mess.
The build always fails with several errors of the form:
Problem generating manifest. Could not load file or assembly 'PATH_TO_NUGET_PACKAGES\microsoft.windows.sdk.contracts\**\*.winmd' or one of its dependencies. An attempt was made to load a program with an incorrect format.
All of them are in that Microsoft.Windows.Sdk.Contracts namespace, which is obtained somewhere along the way. This add-in uses WinForms.
I have seen several answers here and elsewhere to similar problems, but none of the solutions have been useful in resolving my issue.
For instance, in 'Could not load file or assembly exception', several options are given. The accepted answer involves the ClickOnce security setting, but that is not even visible in a Class Library output type, which the add-ins are.
Several other answers in that question and others concern conflicts between 32-bit and 64-bit deployments or dependencies. Some of the answers are for IIS, others not, but in general they mostly hinge around either ensuring that you are using 'Any CPU' as the platform target, or that everything is targeted towards an x86 target. I had been using 'Any CPU' from the start, but changing to any target in the Build settings and the configurations available has had no change in the result. It might be that an architecture target is to blame due to differences in dependencies, but I don't know how to resolve it.
The accepted answer in 'Could not load file or assembly Windows.winmd' suggests excluding the .winmd files by changing their Publish Status in the 'Publish' area of the project's properties. However, since this is an Office Add-in I don't actually have such a button at all.
Another answer mentions adding it to the GAC with gacutil -i, but that won't work for these .winmd files.
This is not my area of expertise, I am not the original author of this add-in, and I barely know what I'm doing when it comes to .NET. Any help sorting this out would be appreciated!
I eventually figured this out. In my case, one of my dependencies was a .NET Framework library that itself depended on a library (by the same vendor) that only had a .NET Standard deployment.
The direct reference was to one that was designed for WinForms solutions, but the underlying one was causing references to all of these WinRT packages, which ultimately were not being allowed by my build. Or something like that.
Anyways, this solution worked for me. I added a direct package reference to the offending Microsoft.Windows.SDK.Contracts assembly, but added an <ExcludeAssets> element as follows to exclude all of the assets of that package from my project. Nothing in my add-in actually depends on them.
<PackageReference Include="Microsoft.Windows.SDK.Contracts">
<Version>10.0.18362.2005</Version>
<ExcludeAssets>all</ExcludeAssets>
</PackageReference>
Once I did that, it compiles without any complaints.

Problems while Importing a C++ managed dll to C#.NET Project

It seems like a duplicate question from the title, but let me clarify that I have already searched and followed different methods.
Basically I have to import a managed C++ dll into a C# project. I consulted some tutorials and finally created a managed C++ dll. Now while importing the dll I got the following error:
An attempt was made to load a program with an incorrect format
I found some solutions like this but these solutions could not help me. Before facing this error I had to consult this solution and then this one too.
Here's a screenshot of how I am trying to import the dll:
Settings:
Code:
Someone please guide me about the right way to import the dll in my project.
This C++ library is for certain architecture (x64 or x86). C# on the other hand is not(Any CPU), that is why this kind of error - C# most likely assumes You have a x64 unmanaged library. You should restrict the architecture in C# project to either of these (x64 or x86) so in both projects they are the same.
Should you not be copying the file as a pre-build step? Make sure it is in the correct location before the build. I would also remove the exit 0, it's not needed.
That DllImport is usual for native C-style APIs, not the managed and C++/CLI assemblies. These .Net assemblies, be they mixed mode or not, can be added in the usual assembly dependency locations.
If this is a "Managed C++" and not a "C++/CLI" assembly, it may also be incompatible with the target .Net framework.

Using C# class in VB.NET website

I've a C# class with CorePoll namespace, I compiled it to .DLL file and put it inside bin folder of website. But I cannot use it. Imports CorePoll returns Could not load file or assembly 'CorePoll' or one of its dependencies. An attempt was made to load a program with an incorrect format.
It's my class file in C# http://pastebin.com/JkdrnXyT
The message An attempt was made to load a program with an incorrect format., typically comes from mixing 64/32 bit environments. When you build your .DLL, make sure to select Any CPU as the Target CPU int the build settings. That way, the DLL should work no matter if the website is running 32 or 64 bit. But be aware, the message also states Could not load file or assembly 'CorePoll' or one of its dependencies., meaning that if you've referenced other libraries in your DLL, they could be failing to load as well.
Edit: After looking at the documentation, another potential cause of this exception is mixing projects built with different versions of the .Net Framework. Is this possibly causing your error?
Components have been created using different versions of the .NET Framework. Typically, this exception occurs when an application or component that was developed using the .NET Framework 1.0 or the .NET Framework 1.1 attempts to load an assembly that was developed using the .NET Framework 2.0 SP1 or later, or when an application that was developed using the .NET Framework 2.0 SP1 or .NET Framework 3.5 attempts to load an assembly that was developed using the .NET Framework 4. The BadImageFormatException may be reported as a compile-time error, or the exception may be thrown at run time.
None of answers helped me, I converted the C# code to VB.NET and used it with no problem, thanks for your time.

Loading DLLs with Microsoft Visual C# 2010 Express

I'm using Microsoft C# 2010 Express with the FrameLink Express drivers from Imperx. When I try to load the DLL at runtime, I get an exception:
Unable to load DLL 'VCECLB.dll': The specified module could not be
found. (Exception from HRESULT:0x8007007E)
If I try to add the DLL as a reference, I get this message:
A reference to 'C:\\VCECLB.dll' could not be added. Please
make sure that the file is accessible, and that it is a valid assembly
or COM component.
Two questions:
Is this an Express problem (i.e. some limitation with Express causing the problem)? I believe the source for the DLL is written in C++, but I wouldn't think that would matter.
Is there a different way to reference the DLL and/or add it to the project? Something I'm doing wrong?
Finally, I've tried adding both the x86 and x64 versions, debug and release. Same failure to add as a reference every time.
That DLL doesn't seem to be .NET (nor COM) code - therefore you cannot load it, nor add a reference to it.
Doesn't have anything to do with your Express version - it's just not a .NET "compatible" DLL and thus you can't load or reference it.
In order to use its functionality, you'll probably have to dive into more "arcane" (and more elaborate and more complicated) methods of calling raw C++ code from .NET - or find a .NET compatible counterpart or version of it.
Actually, the answer appears to be in the first line of the message:
Unable to load DLL 'VCECLB.dll': The specified module could not be found. (Exception from HRESULT:0x8007007E
It says it cannot find the DLL, not that the DLL is not compatible.
The DLL should be located with the other DLLs with your program, and you need to add the DLL to the solution.
If by some chance the DLL is compiled as Native C/C++ (i.e., Not .NET style), it can be called from a C/C++ that is a .NET style, but not a C# routine.
So, if the problem is that the module can be found but not loaded, you need to write a C++ (.NET) routine to call from your C# routine (.NET) to call the C++ (Not .NET).
All code that talks directly to hardware must do this at some level. Most do this for you using multiple DLLs.

Categories

Resources