Embed exe file in a Class library - c#

Is it possible to embed an exe file in a class library (dll file)?
I want to use this exe without the necessity of copying it manually to my workstation. In other words, if I want to use my C# class library in another app, I won't need to copy these exe files in a folder and pass the path of this folder in my app.
If there is a way how to do this, it would be great.
sorry but what I mean is just, I made a library for screenshots using Selenium Webdriver and when creating a new webdriver object, I need to pass the exe file of the webdriver.
what I need the most is that I don't want to copy the exe file if I will use this library to another workstation for example, I want everything to be packaged as one file
Thank you

Well, technically you can embed a binary file as a resource within a DLL (by adding the file as a binary resource through the project properties), but you'll still need to save the file to disk in order to execute it (which is assume what you're trying to do) and will possibly have security issues unless your application is fully trusted.
If the binary file is a resource you can extract the bytes from the static Properties class:
byte[] exe = Properties.Resources.MyExe;
and save it to disk like any other byte array.

If you own the code for the EXE then it would be a lot better for you to turn your EXE code into a library. Then you'll be able to refer to that library from anywhere and call any public functionnality it has. It's a far, far, FAR better approach.
Should you still need to run that code as a standalone process, nothing prevents you from making a new EXE front that will refer to that same library.
Now if you do not have the code, then depending on your deployment strategy you may prefer creating a reusable deployment component / module that can be attached to other application setups.

Related

Access files from inside class library

Background Info:
I needed to convert PDF files to images and have full control over how this is done, and noticed that this functionality does exist in NuGet packages, but only in paid packages. Because I am a cheap bastard I refused to pay for this as I can easily do this in python for free.
I created a way to call a python script from c# that converts the PDF I want to a jpg in the exact way I want, and used this for a while. Now I want to build on this project and thought about creating this into a class library that I can use in multiple projects.
The problem I am now facing is that for this python script to work I need a specific resource, a couple of files in a folder. When I add the existing project (the pdf to img converter) to another project it just adds the DLL, and ignores everything else. The files I need are still in a folder inside the class library.
When I try to access the necessary files the current path is inside the new project, and there those files don't exist.
Directory.GetCurrentDirectory(); tells me that the current path is inside the new project.
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); tells me where the DLL is located, but the files I need aren't there.
I have tried searching for a way to access files inside the class library but I came up with nothing useful.
The question:
Is there a way to access files inside of a project that you are referencing? or is there a way to ensure the files I need are brought over too, instead of just the DLL?
Just for completion, I intend to make this into my own private Nuget package, and Im sure I can get the files I need in the .nupkg, but the same problem will persist, How do I access those files.
If anyone has any experience with this kind of problem, I would be happy to hear from you. Thank you in advance.
I would try to use a c# solution in this case to convert pdf to jpeg.
May be something like this:
Convert pdf to jpeg using a free c# solution
or optimal solution: a nuget package, which you can define as dependency in your nuget package
but there are many other solutions instead a phyton script.
Reason:
If you like to provide a nuget package (even if its company intern) the library
should not have dependencies that are not transparent.
In your case ist the dependency to an available phyton installation in the envirement, where the package will be used.
The software that uses the package must have the rights to execute a phyton script
In additional, you will resolve the issue, that you must be able to store and execute a script, if you use a c# solution

Accessing StreamingAssets resources from C++ DLL in Unity on Android

I have developed a C# application in Unity for Android. Additionally, I built a custom external C++ DLL which is properly loaded and accessible from the C# code. I have also added some .xml files into the StreamingAssets folder which works as expected as I can see those files loaded into the .apk.
Currently my problem is that I'm not able to access such xml files from my C++ library. On one hand I'm not sure how to do it correctly, on the other I tried multiple unsuccessful approaches including trying to understand in which cwd was my DLL loaded and then navigate to the files I needed (which didn't work as I constantly receive an access denied error).
EDIT:
Your replies actually put me on the right track and I solved the issue as follow:
During the OnStart() phase of my application, I use the UnityWebRequest class to extract from the JAR file the required files and then I save them in the Application.persistentDataPath
After that, I pass to my DLL the new path to each file which allows me to access them without any issue.
On Android the StreamingAssets are in a jar. That may well be the reason why you can't access them, but as you can see in the manual you can use the WWW class to retrieve files there.
On Android, the files are contained within a compressed .jar file
(which is essentially the same format as standard zip-compressed
files). This means that if you do not use Unity’s WWW class to
retrieve the file, you need to use additional software to see inside
the .jar archive and obtain the file.
(https://docs.unity3d.com/Manual/StreamingAssets.html)
On Android, the files are contained within a compressed .jar file
(which is essentially the same format as standard zip-compressed
files). This means that if you do not use Unity’s WWW class to
retrieve the file, you need to use additional software to see inside
the .jar archive and obtain the file.
A JAR is a package file format typically used to aggregate many Java class files and associated metadata and resources into one file for distribution. JAR files are archive files that include a Java-specific manifest file. They are built on the ZIP format and typically have a .jar file extension.
This means that you can work with jar files the same way as you do with zip files.
There is a fork for minizip with examples on how to use it.

How to merge a file to a precompiled exe application

I have designed and created two seperate windows application ( say winapp1 and winapp2). Winapp1 creates a file(say file.txt) in the disk containing some text. And I need to merge this file.txt with precompiled version of winapp2 ie winapp2.exe so that the winapp2 can display it.
Winapp1 creates a file with different contents each execution time. And for each file there will be a copy of winapp2 that needs to be merged.
Is there a way to this? If there is, help me.
And my English is not so good. Thanks for reading this.
The easiest solution, (assuming that releasing the source code for winapp2 to the system that runs winapp1 doesn't present problems) is to have the entire source for the winapp2 project accessible to winapp1. The source should include a blank copy of the file as an embedded resource. Winapp1 can then modify the source file and use MSBuild to build a fresh copy of Winapp2.
To modify the text file, you should be able to just use the normal file manipulation .NET methods and to call MSBuild, you may be able to do it via a .NET class, but you can certainly just call the msbuild executable from the relevant .NET framework folder in %windir%\Microsoft.NET\Framework\ and pass in the full path of the project file.

How to get file path of content in class library

I have an Excel file that has a Build Action of content in a class library. The library is referenced by both an ASP.NET WebForms application and a console application, and the Excel file is used by both. Is there a way I can programmatically get the file path of this file?
I know in ASP I can do this:
HttpContext.Current.Server.MapPath(#"bin")
And in the console app I can do this:
Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)
Those work, but I'm wondering if there's better, consolidated way to find the file from the assembly and return the path.
The second approach works fine in all environments you just should change it so that it does not look for the entry assembly but the specific assembly.
Easiest way to do this is:
typeof(Some.Type.From.That.Assembly).Assembly.Location
An alternative would be to use embedded resources so that you can load the file directly from the assembly. Of course, this would not work if the file has to be writable by the user.

How should I call a .NET exe that is distributed with my main application

I have a .NET Windows application that needs to call another .NET executable. I want to distribute this other exe as part of the main project, and was wondering what is the best way of implementing this. We don't want to take the code from this second exe and put it in the main project as we need the exe to effectively remain sealed, as we are also distributing it to third parties.
Options being considered:
Should I add the exe as a file within the project and set Copy to Output as 'Copy always' and then just run it from the main application folder?
Should I add the exe as a reference in the main project? If I do this how would I then call it as an executable with parameters?
I would be grateful for some guidance on the above approaches, and indeed if you have any other ways of achieving my goal.
Thanks!
There are two different ways of executing the code in the exe file:
As a separate process: use System.Diagnostics.Process and pass in any information as command line arguments
In the same process, using normal .NET method calls
In the same process in a separate AppDomain
Both of these work fine; in the first version you wouldn't need your main project to refer to the exe at all: just include it in your setup/deployment project, if you have one. If you're using xcopy deployment (i.e. just taking the contents of the output directory) then you could add a reference to the exe just to get it copied.
To use the second form you'd need to add a reference to the exe file in your project. If you're happy to call the code in-process this is likely to be the simplest solution.
The third form could use a reference but doesn't have to. This gives more isolation than the second option but less than the first.
Copy to output is, of course, the simplest solution.
If you don't want to have this exe hanging around together with your app files, put it to resources and when your application needs to run that exe, just save it to temp folder and run from there.
Here's proof-of-concept code:
class Program
{
static void Main(string[] args)
{
var fileName = Path.ChangeExtension(Path.GetTempFileName(), "exe");
File.WriteAllBytes(fileName, Resources.QueryExpress);
var queryAnalyzer = Process.Start(fileName);
queryAnalyzer.WaitForExit();
}
}
In project properties go to Resources and drag-drop there your exe file. This sample is using application named QueryExpress.exe.
You may also wish to compress your app into ZIP file to make it smaller. This will add one more step to unpack archive before running the process.
You can also make it as Dll Assembly and call it from your application, I meant loading the assembly at run time if it's existed.
Adding a reference to that exe won't help, unless you want to use classes from the exe in you main program. I think your first option is the best

Categories

Resources