I am actually trying to use a DLL on a C# project. The problem is, whenever I try to import it in my project by adding it as a reference, I get this error message :
A reference to "C:\FilePath\LnkEMP.dll" could not be added.
Check that the file is an assembly or a valid COM component
The library is "LnkEMP.dll", used for a program called Expert/M Plus. I need this library to interract with this program.
I think that this DLL is made in C++, which could be one of the reason that my C# project can't load it.
I tried to make a C++ Library and importing it, but this time I had another error message :
A reference to "C:\FilePath\LnkEMP.dll" could not be added,
because it is not an assembly .NET, or not a registered ActiveX control
Do you have any idea of what should I do to get it work ?
You can fall back on dynamic loading of dll using Win32 api calls. There should be lots of examples of dynamical loading/calling of external dll. Hopefully your dll comes with doc on how to use it.
Related
I'm new to the forum and not a professional programmer, so apologies if I am not using the correct terminology.
I am using a 3rd party DLL in my c# forms application, and it has an interface which (in their example) I specify when creating the class:
public partial class frmMain : Form, PIEHid32Net.PIEDataHandler, PIEHid32Net.PIEErrorHandler
The problem is that the dll, which is added to my project as a reference, may not exist. If it does not exist, the application doesn't start (and in Visual Studio I get a FileNotFoundException as soon as I step into the code, before I could add a try/catch etc.
I can create the DLL from the installer which works fine, but historically I have also added it to the app as an embedded resource and exported it at runtime if it did not exist - which is nice if someone just copies the exe rather than doing a full install. But I've never had a DLL with an "interface" defined in the above way. I guess because the class is referencing it, the app will never run.
So is there a way around this? A way to add the interface reference as being "optional", or adding it at runtime AFTER I have exported the DLL to which they reference?
I took a program written in C/C++ and modified it's main function to accept some arguments as input and return a variable as output and created a Win32 DLL out of it. I then created a .NET DLL which uses InterOp to access the first DLL. Now when I load the .NET DLL in my C# app I get a System.DllNotFoundException from the DLL which is really baffling me as there were never memory issues with the program and both Win32/.NET dlls are located in the same directory (apart from modifying the main function, the code has not really changed).
The solution was provided in this thread, which was my original question some time ago. I'm pretty sure that answer is correct but I'm just missing something.
You can download my VS solution Here. The solution contains three projects: the Win32 DLL, the .NET DLL, and a winform app that references the .NET DLL (but when trying to test gives the DLL exception). Any help or debugging guidance would be greatly appreciated.
UPDATE: I have tried all the tips/suggestions below but I still get the exact same error. If it makes things easier, my VS solution is available to download in the hyperlink above.
Make sure you have placed the win32 dll on /windows/system32 folder(if only the dll name is passed to DllImport)
Alternatively you can also pass the full path of the dll to the DllImport Attribute.
Use a tool such as Dependency Walker to make sure you are not missing out on any dependent assembly.
I'm new on windows phone developement and i have one problem that i don't know how to resolve....
the problem is....
i have a c++ project that i had complided with visual c++ 2010 and this create one dll with code compiled...
so i know that C# import dll libraries but when i add refrences it's make this error "Unable to retrieve assembly fullname ""Parameter name: AssemblyPath" and i dont kown what it means...
I searched on google and i found one method to import c++ dll manualy with DllImport and calling a external method... that causes one error because it's dont find the dll location... it's happens because wp7 don't suport C++???
thanks for help me
Neither P/Invoke nor C++/CLI is supported, only managed user code. See social.msdn.
3rd party WP7 apps may only comprise of managed code. C++ is also not a supported language, even in managed form, at this time.
WP7 doesn't support c++. you would also probably need to recompile the c++ dll anyways, even if it was supported.
I've written a .dll in C# to change the permissions on a folder. I also wrote an .exe to test the .dll and it successfully changes the permissions. Now I'm trying to call the .dll from ColdFusion, but I'm getting an error about System/Security/IPermission not being found.
I'm assuming this is an interface in C# that ColdFusion can't find in any of the available assemblies on my system. I've added the System.Security assembly to my References in the C# project. Is there something else I need to do to make sure ColdFusion can find the interface?
Here's how I'm using the .dll:
<cfobject type="dotnet" name="permObj" assembly="#pathToDLLs#CoursePortal.dll" class="CoursePortal.Permissions">
<cfset permObj.revokePermissions(dir, username)>
I never could get it to work. I switched the DLL to an EXE and used <cfexecute> to call it. It's working fine now. The .NET code is called so infrequently it doesn't make much difference that it's a separate app.
I have a DLL that I've been using with no problem in Visual C# (simply adding the reference and using the namespace). Now I'm trying to learn C++, and I don't understand how you reference a namespace from a DLL. I can right-click on a project and select 'references' and from there click 'add new reference', but that just provides me with an empty 'projects' window. What am I missing?
C++ is a lot different from C#/VB.Net when it comes to processing DLL references. In C# all that is needed to do a reference is a DLL because it contains metadata describing the structures that lay inside. The compiler can read this information such that they can be used from another project.
C++ does not have the concept of metadata in the DLL in the sense that C# does. Instead you must explicitly provide the metadata in the form of a header file. These files are included in your C++ project and then the DLL is delay loaded at runtime. You don't actually "add a reference" so to speak in C++ but include a header file instead.
Once the header file is included, you can then access the namespace by including it in your CPP files
using namespace SomeNamespace;
First of all, if you are trying to use the same DLL you used in your C# application, if you are using pure native C++, it is not straightforward to make calls into that DLL. The problem is the DLL you are referencing in C# relies on the .NET framework in order to execute (it is a "Managed" DLL, as all C#, VB.NET and C++/CLI assemblies are). There is an easy way to reference "managed" code from C++ and that is by making a managed C++ project (AKA C++/CLI) (choosing from "CLR" section in the C++ project wizard in Visual Studio). Otherwise the only way to access the managed DLL is by exposing it to COM and using COM to access the object.
EDIT: The previous answer will be more helpful if you're using unmanaged c++; I assumed because of the C# reference that you were targeting managed C++.
The 'Add Reference' dialog should have a series of tabs - 'Projects' lists projects in the current solution; .NET lists the libraries installed in the GAC and 'Browse' lets you find a DLL yourself.
If you just want to add a reference to the DLL you should be able to do it with 'Browse'. If it's the output of a project you have the source to, add the project to the solution and it'll appear under the 'Projects' tab.
If this doesn't help, which version of Visual Studio are you using, and where/what is the DLL you want to use?