Need to load a DLL to use SQLiteWrapper in C# - c#

I am trying to access my databases in C#. The databases are SQLite and I am trying to access it like so:
string CurrentDatabase = Path.FullName + "\\stock.sqlite";
SQLiteBase db = new SQLiteBase(CurrentDatabase);
I am using a SQLite DLL I found here to access the database:
http://www.codeproject.com/KB/database/cs_sqlitewrapper.aspx
But I get this error:
Unable to load DLL 'sqlite3': The
specified module could not be found.
(Exception from HRESULT: 0x8007007E)
I think I know what's wrong, I dont have the sqlite3 DLL anywhere on my system... but I would like this application to be portable so I cannot expect users to already have this DLL installed. I have read about loading a DLL from another application which has already got this DLL somewhere, Firefox is a good example. It's installed on all of my companies machines and if I could some how load the sqlite3 DLL from the Firefox Program Files directory into my application it should work perfectly, no? If that's really the solution I'll need help actually loading the DLL, as I don't know how to do that.
Thanks.

Copy the sqlite3.dll into the same directory where your DLL wrapper is and supply that as part of the distributable of your application when done, in that way there'll be no nonsense associated with dll versioning mismatches.. you can download the latest version from http://sqlite.org

I recommend using System.Data.SQLite, which is an ADO.NET provider for SQLite. Then you can program with the ADO.NET API. Its DLL includes sqlite3.dll, so you don't have to include it.

Related

Could not load file or assembly (DarkRift)

I've been struggling with a problem in Unity and I would appreciate it if anyone can help me.
I'm using a package called DarkRift, which is used for networking and connecting clients with a server (provided by DarkRift). In order to work with the DarkRift server, I need to write plugins. A plugin is basically a visual studio project, compiled to .dll file, then that file is copied to a certain directory on the server-side.
I've been working with DarkRift for some time now and have done so much with it. It was working perfectly! However, I needed to work with Firestore package from Google.
Hence, I created another plugin, installed Firestore (and every package needed), wrote some simple code using one of Firestore's functions, compiled the project, copied .dll to the server, then ran the server. The problem is whenever I run the server (.exe file), I get an error that says: "Could not load file or assembly 'Google.Cloud.Firestore, Version=1.0.0.0, ...' or one of its dependencies."
I get this error when I use any of Firestore's functions. However, if I just include the package (using Google.Cloud.Firestore;) without using any of its functions, I don't get any error. I googled this problem and looked everywhere and could not solve it.
Thanks!
Firestore is distributed as a Nuget package, which indeed has dependencies.
Have you also copied all those dependencies to the server?
It might also be a framework incompatibility.
To get more details about this kind of problem, you can register a logging event handler on AppDomain.AssemblyResolve, which fires when assembly resolution fails.
You can also use tools like dnSpy to dig into the problematic assembly - it shows you all sorts of metadata and it can decompile the CIL, which is invaluable for debugging strange behavior in third party code.
Assembly loading is kind of slow in .Net, so it only loads them when needed.
Hence the resolution does not fail when no code references the assembly.

Oracle.DataAccess.Client Dependencies

First of all, I want to use the Oracle.DataAccess.dll to use OracleBulkCopy.
I want to know all the dlls that I need to be able to read from a database and then perform a bulkcopy in Oracle. Currently, we are using only one dll to perform all the reads from databases, we are using Oracle.ManagedDataAccess.Client. But I can't use it to perform a bulkCopy.
I don't want to install ODP.NET for the users, I want to include the dll directly in the program. So I want to know the minimum required dlls to be able to use the Oracle.DataAccess.dll in 32bit and in 64bit.
I know that there are some old post about this, but it's quiet old and the listed dlls are out of date. I can't event find some of them.
I installed the ODP.net for ODAC12 and I retreived all the listed dlls in this post. I also tried with with this post. The listed dlls are pointing out the version 11.
I made a dummy project that opens a connection, reads a table and bulk it in another table. I copied the listed dlls from the posts in the root of the project and I included Oracle.DataAccess.dll in the project.
When I run my program in 64 bit I get the following error:
Could not load file or assembly 'Oracle.DataAccess, Version=4.121.2.0,
Culture=neutral, PublicKeyToken=89b483f429c47342'
When I run it in 32 bit, I get this error:
Unable to load DLL 'OraOps12.dll': The specified module could not be
found. (Exception from HRESULT: 0x8007007E)"
The dlls that I included are:
oci.dll
ociw32.dll
Oracle.DataAccess.dll
orannzsbb12.dll
oraocci12.dll
oraociei12.dll
OraOps12.dll
I managed to make it work.
Download the good version of the ODAC that will target your project.
For a 32bit project you need to download the ODAC12..._x32.zip (ODAC121021Xcopy_32bit.zip).
For the 64bit project you need to download the ODAC12..._x64.zip
Unzip it in an empty folder depending on the version you want (32bit vs 64bit).
Locate in the instantclient_12_1 folder all the dlls by searching *.dll in the windows search bar. You need to grab:
oci.dll
ociw32.dll
orannzsbb12.dll
oraociei12.dll
oraons.dll
Locate in the odp.net4 or odp.net20 folder depending on your .NET version this two dlls:
OraOps12.dll
Oracle.DataAccess.dll
Copy the those 32bit dlls or 64bit dlls and put them directly in the Output path of your project. For example in C:\...\vsProjects\BulkInsert\BulkInsert\bin\Debug.
Browse Oracle.DataAccess.dll in your project by pointing on the Output path.
UPD: recent versions of the ODP.NET provider (downloaded from here) have "19" suffix instead of "12" in their filenames:
oci.dll
ociw32.dll
orannzsbb19.dll
oraociei19.dll
oraons.dll
OraOps19.dll
Oracle.DataAccess.dll
I experienced similar problem; install oracle data access components (odac ODTwithODAC122010.zip) for solution.
Looks like you did not install the Oracle Instant client (or any other version of Oracle Client). This is a prerequisite for unmanaged ODP.NET provider.
Install the Oracle Instant client and you are fine. Otherwise you will get nothing but trouble.

MySql.Data reference in my own .dll only functions on development computer, not on end user's computers

I have a question as a novice programmer regarding a MySql.data reference I added from the MySql connector net, to my code. The program that I compile would be made into a .dll that runs from within another application. The application is a stock trading program, and my code is a strategy that makes evaluations of price data and executes buy and sell orders, etc.
Just when I thought my strategy was fully developed I've run into a new snag I'd love to have someone's help with in solving.
I'm asking stackoverflow because the support forum mods of the trading application removed this question from their forums, probably because it was outsie their supportable boundaries.
I've been adding extra .NET references to my strategy, like windows forms and system.management, etc so that it would be able to check the computer's hard drive 'serial number' to make sure that the strategy is licensed on that computer. Everything has been working ok so far, and I was able to get the strategy to run on other computers by exporting it as a .dll
The latest and final addition I made was to add a reference to MySql.Data.MySqlClient (which is a .dll that had to be downloaded and installed separately and isn't part of .NET) so that it could check the computer's hardware ID against an online database to see if it's on the whitelist. I got that working perfectly on the development computer, and as soon as I tried to get it running on my other computer, this error message came up in the output window:
NT Error on calling 'OnStartUp' method for strategy 'MyStrategy/7f5e28c481644cb5a7754d0b7a0be47f': Could not load file or assembly 'MySql.Data, Version=6.1.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d' or one of its dependencies. The system cannot find the file specified.
I don't fully know what is happening, but it seems that in the past all external .dll from microsoft .NET that I referenced in my code were carried over and functioned perfectly on other computers, and while my code runs with the MySql.Data reference, once any MySql commands are run the program terminates and says that error message about a missing file. (But if I comment out those lines of code it runs fine, just without the licensing checks I need to have)
One last thing I can mention for more information, as I'm new to this area of development and don't know if it matters, is that I installed the most recent MySQL connection net to the laptop which is a later version than the 6.1.6.0 that I have on the development computer.
The strategy runs exactly as intended on the computer it was developed on though.
My main question has two parts to it then:
1) Is there a way to embed or merge the MySql.Data .dll so that it can be a part of my .dll?
2) Will every end user of this software need to have MySql connection net installed on their computer, and the exact same version as whatever it was developed in (noob question)
Any answers, guesses and speculation are welcomed and appreciated.
Just check if your programs output directory contains the MySql.Data dll file.
If not Try to copy the MySql.Data dll file to the output directory of your program.
it should solve your problem.
The problem happens because may be you are referencing the MySql.Data dll from any other directory rather then copying it to the local project directory. or may be it is not copying into your projects output directory.
So when you run the program to another machine it is unable to find the MySql.Data dll file in specified directory and says
MyStrategy/7f5e28c481644cb5a7754d0b7a0be47f': Could not load file or
assembly 'MySql.Data, Version=6.1.6.0, Culture=neutral,
PublicKeyToken=c5687fc88969c44d' or one of its dependencies. The
system cannot find the file specified

Using Log4Net Without DLL

My C# WinForms application is designed to be simple to deploy and I don't like the fact that the log4net.dll becomes an additional file to deploy. Is there a way I can embed it into my application so all the user gets to see if the main .exe file and the backend SQL CE database?
Yes. You can do that using ILMerge.
ILMerge is a utility that can be used to merge multiple .NET assemblies into a single assembly. ILMerge takes a set of input assemblies and merges them into one target assembly. The first assembly in the list of input assemblies is the primary assembly. When the primary assembly is an executable, then the target assembly is created as an executable with the same entry point as the primary assembly.
Here's a GUI for ILMerge to make things easier for you
Well, as a side approach (other than ILMerge),
You can log everything in your server where you have deployed your application using log4net. When you want to retrieve your log, use Webrequest to get the data from the server.
Provided everything will need internet connection to log.

Where do I deploy the DLL's to be used while calling unmanaged code from a custom .Net Data Provider which will be deployed to the GAC?

I have build a custom .Net Data Provider and am in the process of trying to deploy it so that I can use it in SQL Integration Services (SSIS). The issue that I am running into is that I am referencing unmanaged methods in a Win32 DLL. In order for my Data Provider to work in SSIS, I have to sign my managed provider DLL and deploy it to the Global Assembly Cache (GAC). When I try to use my Data Provider in Business Intelligence Development Studio (BIDS), it gives me the following error:
TITLE: Connection Manager
------------------------------
Test connection failed because of an error in initializing provider. Unable to load DLL 'RTB32.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
------------------------------
BUTTONS:
OK
------------------------------
How/where am I supposed to deploy the unmanaged code along with my provider so that it works? Things I have tried:
Embedding the DLL's into the managed DLL.
Adding the unmanaged DLL's to the GAC.
Adding the location of the unmanaged DLL's to the PATH System Variable.
Putting the unmanaged DLL's into the System32 directory (out of desperation)
Side Note: When I use my Data Provider in a Forms app with the unmanaged and managed assemblies in the same directory, everything works without any issues.
Side Note 2: I want this Data Provider to work in more places that just SSIS. I also want it to work as a Linked Server in SQL Server, as a Data Source in SSRS, as a Data Source for Visual Studio, in the Entity Framework, etc. I would prefer to put the DLL's in one place that will work for all of these.
Thanks!
Chris
If this is a 32-bit app running on a 64-bit OS, then you will need to install the DLLs in the C:\Windows\SysWOW64 directory.
Otherwise, they should go into C:\Windows\System32.
In both cases, obviously, you would need to use the appropriate drive and directory for the machine you are installing on.

Categories

Resources