Deploy C++ CLI wrapper project - c#

I don't know any further and hopefully, someone can help me out (even if I cannot share code / libraries).
I have a C# .NET 5.0 WPF application, which references a C# .NET 5.0 Class library (project reference). This library communicates with a C++ CLI .NET 5.0 library (where some complex C++ code is running and I don't know, if I can change this to something like P/invoke).
You probably have heard of BadImageFormatException which seems to be very often happening using this combination, and I googled a lot to this topic.
My problem is, that I can run the application on my development machine (from Visual Studio or compiled binaries (exe from file system)), but when I want to provide this program to someone else, who has not Visual Studio installed, this person gets this BadImageFormatException.
I set up a VM to try out further and installed the following runtimes (the application is set to run as 32-bit):
Microsoft Visual C++ 2008 - x68 (9.0.21022)
Microsoft Visual C++ 2010 x86 Redistributable - 10.0.30319
Microsoft Visual C++ 2013 Redistributable (x64) - 12.0.30501
Microsoft Visual C++ 2013 Redistributable (x86) - 12.0.30501
Microsoft Visual C++ 2015-2019 Redistributable (x64) - 14.25.29914
Microsoft Visual C++ 2015-2019 Redistributable (x86) - 14.25.29914
Microsoft Windows Desktop Runtime - 5.0.5 (x64)
Microsoft Windows Desktop Runtime - 5.0.5 (x86)
As the application worked fine on my machine, I think I can exclude issues regarding 32-bit / 64-bit mismatchings (which is often the source of the BadImageFormatException), so maybe there is just something missing in terms of runtimes / redistributables / ...
In addition I should mention, that I never had programmed with C++ before, therefore I don't know the restrictions / requirements to deploy these kinds of applications.

I was able to fix it by myself!
In the *.vcxproj file, I accidentally made it to set the Release configuration to <UseDebugLibraries>true</UseDebugLibraries>, changing this value to false solved all problems automagically.
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CLRSupport>NetCore</CLRSupport>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>

Related

VC++ prerequisite according to paltform target into single installer

I am having an .NET 4.0 application which needs VC++ 2010 Redistributable Package installed. While creating Setup Project using Visual Studio Installer project I have selected Visual c++ 2010 Runtime Libraries (x64) and Visual c++ 2010 Runtime Libraries (x86) to support on both 32bit and 64bit platforms.
While testing installer on 32bit machine it gives error
Prerequisite check for system component Visual C++ 2010 Runtime
Libraries (x64) failed with the following error message: "Installation
of Visual C++ 2010 Runtime Libraries (x64) is supported only on x64
machines."
How can I make Visual c++ 2010 Runtime Libraries Prerequisite conditional according to platform target.
You can't, if the VC redist package won't let you. The reason is that different architectures require separate MSI setups:
http://blogs.msdn.com/b/heaths/archive/2008/01/15/different-packages-are-required-for-different-processor-architectures.aspx
So if you are really building an app and setup that is intended for both 32 and 64 bit then you build two setups, an x86 one with the x86 VC redist for 32-bit and an x64 one with the redist for 64-bit. You can add a condition to prevent the x86 setup from installing on x64, referring clients to the x64 setup.

Prerequisites for deploying a .NET C++/CLI DLL?

I've written a C++/CLI DLL to be used with my GUI .NET application. On my local development machine, everything works as expected. My GUI application says that it cannot load my C++/CLI DLL on any other machine, though. It always says that it cannot load my DLL or one of its' dependencies. So I was thinking maybe it's some missing C runtime or something?
Are there any prerequisites that need to be installed prior to using my C++/CLI DLL on another machine? Strictly from a .NET perspective, or C++ run-time, or whatever.
Edit: Sorry. It's VS2012, .NET 4.0, Platform Toolset v110.
In addition to the dependencies that other .Net languages have (e.g., the .Net framework), C++/CLI requires the C++ runtime.
You can download the C++ runtime redistributable for VS 2012 from Microsoft. Select the x86 or x64 version based on the compilation setting of your C++/CLI assembly, not the version of Windows the target machine is running.
Note that this is the runtime for Release compiles only. Debug compiles use a different runtime, which does not have a redistributable, and is only installed with Visual Studio.

System.core dll can not be referenced

I am trying to solve Dlls reference problem in Visual studio 2012. All dlls have set them self in a way they are looking for .net 4.0 version while I can not install because i have already .Net 4.5 installed with Visual studio 2012.I have asked this Question
but I didnt get a proper answer.Now I am trying to reference System.Core in 4.5 but it can not be referenced as visual studio is not allowing me to do, it says it will be referenced automatically during project build but actually it does not.I am in catch 22 situation.Kindly advise.
I have reinstalled Visual studio 2012 but it didn't help.
Zara, I've looked at the download link you provided and it appears to me it's only for Windows8. Windows7 and Windows8 are very different in how they handle things I personally wouldn't dream of trying to install such an SDK on my Windows7 machine.
My suggestion to you is therefore to try to uninstall the SDK and then it might work again. If this SDK only works for Windows8 then there is no use having it installed on your Windows7 machine. Windows7 is good at keeping backups of all files it replaces when installing SDKs and other things so uninstalling the SDK might restore it to what it was before and it might be just fine after that.
If this doesn't make any difference then I would suggest reinstalling .Net 4.5 AFTER uninstalling the Win8 SDK.

Why install Microsoft Visual C++ 2010 Redistributable Package x86 to use SQLite?

I wrote windows application with C# and SQLite. When Microsoft Visual C++ 2010 Redistributable Package x86 was installed on a PC application runs correctly but if Microsoft Visual C++ 2010 Redistributable Package x86 not install, application doesn't run. Why?
Is SQLite depend on Microsoft Visual C++ 2010 Redistributable Package x86 ?
The version of SQLite is compiled by VS2010, and it depends on the C runtime libaries, thus it needs Visual C++ 2010 Redistributable Package x86.
Yes. SQLite is probably written in C++. It's compiled with /MD option which means it needs the msvcrt#.dlls at runtime. The Restributable Package installs this without which it cannot run
Because SQLite obviously developed the SQLite.Interop.dll in C++, and because they say so:
(11) Why do I get a DllNotFoundException (for "sqlite3.dll" or "SQLite.Interop.dll") when trying to run my application?
Either the named dynamic link library (DLL) cannot be located or it cannot be loaded due to missing dependencies. Make sure the named dynamic link library is located in the application directory or a directory along the system PATH and try again. Also, be sure the necessary Visual C++ runtime redistributable has been installed unless you are using a dynamic link library that was built statically linked to it.
Emphasis mine on that last part. You need the static binaries from the system.data.sqlite download page in order to NOT need the C++ runtime. On that same page, where the binaries are provided, those that do require it will tell you it is - for example, the Visual C++ 2010 SP1 runtime for x64 is required for 4.0, and Update 4 of that is needed for .NET 4.5, according to the page. I've used the 2015 version, Update 3, with the .NET 4.0 versions with no issues.
Note - you might not be aware, but if you try hosting an application that uses the SQLite DLLs on a file share and connect to that application across the network from a workstation, that workstation will still need the C++ runtime because it is running the application in its memory.
Reference: http://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q11
Link to Microsoft Visual C++ 2015 Redistributable Update 3, which I know works with the 64-bit, .NET 4.0 versions of the SQLite binaries:
https://www.microsoft.com/en-us/download/details.aspx?id=53840
SQLite depends on the Visual C++ runtime, but you don't need to install it on the client machine. The system.data.sqlite download page contains several "static" packages that already contain the runtime.
All the "static" packages contain either native or mixed-mode assembly binaries linked statically to the appropriate version of the Visual C++ runtime. Typically, these packages are used in cases where customer machines may not have the necessary version of the Visual C++ runtime installed and it cannot be installed due to limited privileges.
For example, on my machine I am running Windows 8.1 x64 so I went under Precompiled Statically-Linked Binaries for 64-bit Windows (.NET Framework 4.0) and downloaded sqlite-netFx40-static-binary-x64-2010-1.0.90.0.zip.
This binary package contains all the binaries for the x64 version of the System.Data.SQLite 1.0.90.0 (3.8.2) package. The Visual C++ 2010 SP1 runtime for x64 is statically linked. The .NET Framework 4.0 is required.
I then unzipped the package and ran test.exe to make sure everything works. Zero installation required.

Visual C#: Compile with Runtime DLLs

I'm trying to compile my program in Visual C#. However, the machine I need it to run on (well, I need it to be able to run on any Windows Machine, at least Windows XP) does not have the .NET DLLs installed. I'm new to this, so how can I compile my Visual C# program with the runtime DLLs so that it will run on other machines?
If you use Click-Once deployment, you can set a setting in the installer that the installer should install the .NET framework before running. If that's not an option (such as target machine has slow/no internet connection) you can install the redistributable version of .NET
There is no way. You need .NET runtime installed prior running any .NET application.
You can't. .Net programs can only run if the .Net framework / CLR is installed on the target machine. There is no pure XCOPY deployment story for this scenario.

Categories