'Oracle.DataAccess' assembly not load - c#

I already installed odac in my pc.I installed visual studio 2012.ORACLE.Data.Access dll available in my refrence.but i am getting following error
Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format.
How can i get rid of this problem.I am running this app locally

The important part of the error message is An attempt was made to load a program with an incorrect format. This is caused by one of two problems:
The Oracle.DataAccess.dll file is compiled in 32 bit and your application is compiling to 64 bit
The Oracle.DataAccess.dll file is compiled in 64 bit and your application is compiling to 32 bit
To fix this, change the CPU Architecture target of your application to x86 if the DLL is 32 bit, or x64 if the DLL is 64 bit.
From the Microsoft documentation for System.BadFormatException:
This exception is thrown when the file format of a dynamic link library (.dll file) or an executable (.exe file) doesn’t conform to the format that the common language runtime expects. In particular, the exception is thrown under the following conditions:
An earlier version of a .NET Framework utility, such as ILDasm.exe or installutil.exe, is used with an assembly that was developed with a later version of the .NET Framework.
To address this exception, use the version of the tool that corresponds to the version of the .NET Framework that was used to develop the assembly. This may require modifying the Path environment variable or providing a fully qualified path to the correct executable.
You try to load an unmanaged dynamic link library or executable (such as a Windows system DLL) as if it were a .NET Framework assembly. The following example illustrates this by using the Assembly.LoadFile method to load Kernel32.dll.
A DLL or executable is loaded as a 64-bit assembly, but it contains 32-bit features or resources. For example, it relies on COM interop or calls methods in a 32-bit dynamic link library.
To address this exception, set the project's Platform target property to x86 (instead of x64 or AnyCPU) and recompile.
Your application’s components were 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 tries 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 tries to load an assembly that was developed using the .NET Framework 4 or later. The BadImageFormatException may be reported as a compile-time error, or the exception may be thrown at run time. The following example defines a StringLib class that has a single member, ToProperCase, and that resides in an assembly named StringLib.dll.
Specifically, item #3 is the root cause of your problem.

Related

Installer created by VS 2008 deployment project fails with error "System.BadImageFormatException"

I have created an installer with Visual Studio 2008. VS project type is deployment project. This installer fails in some environments but also runs perfectly in some other environments.
For example, the installer is compiled in virtual machine that runs Windows Server 2012 R2 Standard. Of course installation succeeds there. How ever, it fails in other virtual machine running same Windows edition.
The error message is: "Error 1001. Exception occurred while initializing the installation: System.BadImageFormatException: Could not load file or assembly 'file: Custom actions.dll' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded."
Target framework is 3.5 in all applications in the installer solution. Also the references in Custom Actions library have .NET version 2.0 or 3.5.
What is missing in the failing environment? Where to start the search?
Blog: Maybe check this blog quickly. Essentially: 1) bitness 32/64, 2) corrupted binary file or 3) configuration issues (app.config).
InstallUtilLib.dll: Here is a similar answer: System.BadImageFormatException: Could not load file or assembly (from installutil.exe). It links to this MSDN explanation: 64-bit managed custom actions throw a System.BadImageFormatException exception. Seems likely.
Alternatives: The real answer - IMHO - would be to avoid Visual Studio Installer projects due to a number of known problems with this type of project. The WiX toolkit is a good open source alternative. And there are other, commercial options. And there is an alternative version with more elaborate details.
Some Links:
System.BadImageFormatException: Could not load file or assembly
BadImageFormatException Class
This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded
There are really only two reasons for this error:
You have 32-bit (or 64-bit) code trying to call an assembly of the opposite architecture. In custom action calls you'll need to chase down the calling sequence and be careful of AnyCpu types of assembly that may be JIT compiled to the architecture of the system rather than assemblies you'll call.
Incompatible NET architectures. In your case, the assemblies you referred to are all NET 2.0 CLR-based. If they end up running in a NET 4.0 CLR they will fail. It may help to look at the Launch Conditions to see what's going on.
I also think Visual Studio 2008 is not a good basis for a setup project. VS Community Edition is free, and will host the add-on Installer Projects. Certainly VS 2008 is unaware of NET 4.0 CLR.

Missing system assembly in .appxupload only

We're developing an UWP LOB app to be published via the Windows Store for Business (build target >= 1607). The UWP application references:
Stubble.Core via nuget (targets .NET Standard 1.3) which references
System.Reflection.TypeExtensions 4.3.0, which references
System.Private.Reflection.Extensibility.dll version 4.0.0.0.
The app will compile and run locally both in debug and release (compiled via .NET native) mode. When uploading the .appxupload to the Windows Store, the resulting app will throw an exception:
System.IO.FileNotFoundException: Could not load file or assembly 'System.Private.Reflection.Extensibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
File name: 'System.Private.Reflection.Extensibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
at Internal.Reflection.Extensions.NonPortable.PropertyPolicies.GetInheritedMemberInfo(PropertyInfo underlyingMemberInfo, Type reflectedType)
at Internal.Reflection.Extensions.NonPortable.MemberEnumerator.d__11.MoveNext()
at System.Collections.Generic.LowLevelList1.InsertRange(Int32 index, IEnumerable`1 collection)
at System.Reflection.TypeExtensions.GetMembers(Type type, Object nameFilterOrAnyName, BindingFlags bindingAttr)
at System.Reflection.TypeExtensions.GetMembers(Type type, BindingFlags bindingAttr)
at Stubble.Core.Settings.RendererSettingsDefaults.GetMemberLookup(Type objectType)
I can reproduce this issue when extracting the .appxbundle from the .appxupload and sideloading the package via PowerShell. Note, that the .appxbundle within the .appxupload features .NET assemblies and is therefore not compiled to .NET native.
I figure that the Windows Store is should perform this task, but it actually does not (as you can see from the stack trace above) - maybe due to the fact, that we're utilizing the Desktop Bridge feature for our UWP app.
When searching for the System.Private.Reflection.Extensibility.dll, it seems that this assembly relates to .NET Native and the build chain (as it comes with the .NET Native nuget package and MSBuild).
So my question is: Why does the app fail to load the assembly (but does not in debug/release mode)? Does System.Reflection.TypeExtensions expect the app to be compiled with .NET Native which actually works locally?
I tried:
Uploading the .appxbundle compiled with .NET Native (which is not accepted by the store)
Referencing different versions of the
Microsoft.NETCore.UniversalWindowsPlatform package (which includes the .NET Native packages)
Referencing the private library manually (which yields compiler errors because of duplicated assembly references)
Upgrading System.Reflection.TypeExtensions to 4.4
Created a .wapproj wrapper for deployment (issue remains the same)
Added a binding redirect, which causes the app to crash
So the problem seems to be caused by the Windows Store not re-compiling the AppX bundle with .NET Native.
If you build an UWP app locally, within ...
Debug mode, you will get an AppX bundle with .NET assemblies and a reference to the .NET Core CLR (which works)
Release mode, you will get an AppX bundle with a natively compiled application and a reference to the .NET Native runtime (which works as well)
When creating an app package to be submitted to the Windows Store, you will get an AppX bundle with .NET assemblies and a reference to the .NET Native version which should be used by the Windows Store to re-compile the application (determined by the version of the Microsoft.NETCore.UniversalWindowsPlatform nuget package you are using).
For apps with the runFullTrust capability enabled, the Store will not re-compile the application. Therefore, you will distribute an AppX bundle which contains .NET assemblies and relies on the .NET Native runtime (which actually runs remarkably well). As soon as the CLR attempts to load an assembly of the .NET Core implementation, you'll get the error mentioned above. Additionally, your app will be way slower compared to the .NET Native-compiled one.
I guess for a regular AppX bundle with runFullTrust enabled, the Store cannot decide whether to re-compile the app, as such a package could contain other application types (e.g. Windows Forms or WPF).
To overcome this issue, create a "Windows Application Packaging Project" and add the UWP application as a reference. Submit the AppX bundle generated from that project to the store. The Windows Store will then re-compile the .NET assemblies as expected.
For further reference, see Could not load file or assembly 'System.Private.CoreLib...'.

BadImageFormatException occurring when loading a native DLL in .NET 4.0

I'm attempting to use a CAN device over USB that comes with a native DLL that needs to be wrapped by a .NET C# class (source code provided by the vendor) that gets included in one's project. Their sample applications target .NET 2.0 where my application targets .NET 4.0. I'm able to use the code in their sample apps and debug everything just fine, however, when I try to debug my application, I get a BadImageFormatException:
System.TypeInitializationException: The type initializer for 'TotalPhase.KomodoApi' threw an exception. ---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
The only differences between their code and mine appears to be that their code is an application built for .NET 2.0 and (currently) my code is running as an MSTest unit test in .NET 4.0. Both solutions target AnyCPU. I'm running on a Windows 7 Ultimate 64-bit install. Even changing from AnyCPU to x86 didn't make any difference. How can I get this native DLL to load in an AnyCPU project?
If you get a BadImageFormatException when interfacing with a native DLL, it almost always means that you are trying to interface with a 32-bit DLL while running in the 64-bit CLR, or vice versa.
When you run the sample applications, do the processes have *32 in the "Image Name" column of Task Manager's "Processes" tab? That indicates the applications are running in the 32-bit CLR. Check your own application as well. It is possible that the machine you are testing on only has a 32-bit .NET 2.0 runtime, but both 32-bit and 64-bit .NET 4.0 runtimes, or the other way around.
If you are distributing a native DLL with your .NET application, then you should set your startup project to target x86 or x64 (as opposed to AnyCPU), depending on whether the native libraries are 32-bit or 64-bit. You can always ship both 32-bit and 64-bit versions, and let the installer choose which binaries to install based on the client architecture.
Alternatively, you can ship both 32-bit and 64-bit DLLs with different file names, define separate P/Invoke stubs for each version, and decide which one to call at runtime. The easiest way to do this would probably be to wrap your native calls in an interface (e.g., INativeMethods) and choose which implementation to instantiate at runtime based on IntPtr.Size. With this method, you could still target AnyCPU.

how do I fix the System.BadImageFormat exception?

I am having a visual studio 2010 window service application in .net framework version 3.5 but I need to use a dll in my service which was built in .net framework version 4.0.So I have upgraded my version to 4.0 but while installing my service i am having system.BadImageFormatException.How to fix this.Please suggest some solution.
This is the error message I am getting
Error 1001.Exception occurred while initializing the installation: System.BadImageFormatExceptio: could not load file or assembly 'file://C:.....exe' or more or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.
Thanks in advance
The application and the DLL (including all dependencies of each) must all be either 32-bit or 64-bit. Most likely, the binaries you are using are not. To fix the problem build or otherwise obtain access to the correct binaries.
If this is not the problem, the "remarks" section of the documentation lists all the reasons that can cause this exception to be thrown, including solutions for each.

When executing an application on .net 4.0, compiled under .net 2.0

Assuming that:
The C# source code below is compiled under .NET 2.0 (CLR 2.0); and
The above application uses the app.config listed below; and
Only .NET 4.0 (CLR 4.0) is installed on the environment of the client executing the application,
then which version of .NET is internally loaded to execute the application on the client's environment?
Description
The console application below will simply show that its CLR version is v4.0.30319 in the console, but #Reed Copsey's answer of the stack (CLR 2.0 vs 4.0 performance?) shows that .NET 2.0 is loaded in this case. Moreover, at MSDN it says when useLegacyV2RuntimeActivationPolicy is set to false false:
Use the default activation policy for the .NET Framework 4 and later,
which is to allow legacy runtime activation techniques to load CLR
version 1.1 or 2.0 into the process.
It sounds like .NET 2.0 is loaded in spite of the app.config having a .NET 4.0 configuration. Have I misunderstood anything?
Source
C# source code
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string version = Environment.Version.ToString();
Console.WriteLine(version);
}
}
}
app.config
<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="false">
<supportedRuntime version="v4.0.30319"/>
</startup>
</configuration>
The bottom line is that under your scenario, you specified .Net 4 as your only supported runtime, so your app will load with CLR 4.
The CLR behavior with your program is exactly as designed:
When I run your test app with the supportedRuntime as v4.0, Process Explorer shows it loads mscorlib v4.0.30319.
When I run with supportedRuntime as v2.0.50727, Process Explorer shows it loads mscorlilb v2.0.50727.
When I run with no supportedRuntime element, Process Explorer shows it loads mscorlilb v2.0.50727.
This blurb from Microsoft states that the supportedRuntime element defines the specific version on which your program runs:
By default, an application runs on the version of the .NET Framework that it was built for. If that version is not present and the application configuration file does not define supported versions, a .NET Framework initialization error may occur. In this case, the attempt to run the application will fail.
To define the specific versions on which your application runs, add one or more elements to your application's configuration file. Each element lists a supported version of the runtime, with the first specifying the most preferred version and the last specifying the least preferred version.
There are two separate elements at play, here. Only the supportedRuntime element applies to your scenario.
The supportedRuntime element defines the CLR versions on which your app will run, in the preferred order. If you list supported runtimes, then those CLR versions will be used, going down the list from top to bottom until an installed CLR version is found. If you don't list support runtimes, then your program will run with the version of the CLR against which it was compiled.
The useLegacyV2RuntimeActivationPolicy element applies only to mixed-mode assemblies --- programs or DLLs that contain managed (.Net) and unmanaged (native) code. Your sample program isn't a mixed-mode assembly. For mixed-mode assemblies, setting the value to false (the default), or not setting it all, uses the new .Net 4 in-process side-by-side loading for mixed-mode assemblies, so your app can run with CLR 4, and load a mixed-mode assembly in the same process using CLR 1.0-2.0. Setting it to true essentially reverts to the previous functionality prior to .Net 4, where the in-process side-by-side functionality is disabled, and whatever CLR version is selected to run the app will attempt to load your mixed-mode assembly. The CLR version used to load the mixed-mode assembly will be whichever one is selected to run the app, based on which version was used to compile the app, and your listed supported runtimes, if any.
There's an MSDN Magazine article and an MSDN article about .Net 4 loading and In-Process Side-by-Side (In-Proc SxS) execution for COM components, which also has an impact on your scenario without COM components. Prior to .Net 4, if you compiled your app with a version of the CLR, and that version wasn't available on the system at runtime, the app would automatically run on a newer version of the CLR if it was installed. As of .Net 4, apps now won't run with a newer version of the CLR unless you specify the newer version in the supportedRuntimes element.
Here's a quote from the MSDN article:
Application developers. Side-by-side hosting has almost no effect on application developers. By default, applications always run against the version of the .NET Framework they were built on; this has not changed. However, developers can override this behavior and direct the application to run under a newer version of the .NET Framework (see scenario 2).
Library developers and consumers. Side-by-side hosting does not solve the compatibility problems that library developers face. A library that is directly loaded by an application -- either through a direct reference or through an Assembly.Load call -- continues to use the runtime of the AppDomain it is loaded into. You should test your libraries against all versions of the .NET Framework that you want to support. If an application is compiled using the .NET Framework 4 runtime but includes a library that was built using an earlier runtime, that library will use the .NET Framework 4 runtime as well. However, if you have an application that was built using an earlier runtime and a library that was built using the .NET Framework 4, you must force your application to also use the .NET Framework 4 (see scenario 3).
Finally, if you're on Vista, Win7, Server 2008, Server 2008 R2, you automatically have CLR 2.0 installed. Therefore, if you were to remove your supportedRuntimes element, or change it to v2.0.50727, you might still have CLR 2.0 available as a runtime.

Categories