How can I use a precompiled C/C++ dll in a C# project?
Someone kindly showed me how to utilize the dll in C and while I understand the structure I don't have any idea how hooking into a dll from C# works and only the barest for C, only really knowing the basic attribute in C# such as DllImport["example.dll", CallingConvention = (I don't really know how to use CC)].
15 Replies
What do you have about those dll files? Any document or any kind of declaration?
They are projects on github. Sadly they don't have much documentation.
GitHub
GitHub - ModOrganizer2/usvfs at v0.5.6.2
library using api hooking to implement process-local filesystem-independent file links. - GitHub - ModOrganizer2/usvfs at v0.5.6.2
GitHub
GitHub - Holt59/usvfs-example
Contribute to Holt59/usvfs-example development by creating an account on GitHub.
I understand the .h files in the includes folder in the example are setting up functions using the dll to be used in the main code but I'm not sure how I could translate what that shows over to C#.
Maybe take a look at this.
https://learn.microsoft.com/en-us/dotnet/framework/interop/marshalling-data-with-platform-invoke
I am also importing some dll for a project, just matching the data types.
Marshalling Data with Platform Invoke - .NET Framework
Marshal data with platform invoke in .NET. See a list of data types used in Windows APIs and C-style functions, and find their .NET managed type equivalents.
I had a related question on here too.
https://discord.com/channels/143867839282020352/1260449879323443200
I'm not too sure how applicable that is for me
My hangup is I can see that in C a specific function is accessed in the main "class" by including "__declspec(dllimport) void WINAPI usvfsClearVirtualMappings();" under the include folder
I don't know how to be sure I'm accessing the same function by using DllImport in C#
Unknown User•5mo ago
Message Not Public
Sign In & Join Server To View
Ah sorry, I didn't take a deep look into the repo
WINAPI means StdCall calling convention in C#, which is the default in Windows, so you can leave out calling convention if that's what your C DLL defines and you only care about Windows.
all you need for a proper DllImport declaration is to use compatible C# types for all args to the function.
the easiest way to generate compatible declarations these days is to use https://www.nuget.org/packages/ClangSharpPInvokeGenerator
you point the generator app at your library's .h file, and it will create C# bindings for you.
ClangSharpPInvokeGenerator 18.1.0
ClangSharp are strongly-typed safe Clang bindings written in C# for .NET and Mono, tested on Linux and Windows.
if you're shaky on the C side as well as the C# side, it can be tricky business, but if you know C reasonably well, it's pretty easy to make sure the bindings are compatible
Thank you!
I have a decent understanding of it and seem to be able to link some methods to their functions but it is extremely reliant on pointers in a way that C# doesn't seem to support.
I am familiar enough with C to manipulate the example executable and get it to set up the VFS and launch a desired executable. Maybe I could write the GUI in C# and have it save the file system structure to a text file, then use a C executable as an in-between that can have the text file and the executable to launch with the VFS passed as arguments?
reliant on pointers in a way that C# doesn't seem to supportthis is unlikely. there may be some opaque pointer typedefs that don't translate cleanly, but you can just declare those as
void*
in C#. a pointer is a pointer at the ABI levelMaybe. I'm not familiar at all with pointers other than what I've read doing this. The debug info printout is reliant on was a string pointer and I couldn't find info on getting that working. I don't think they were used as pointers but there were also LPSECURITY_ATTRIBUTES, LPSTARTUPINFOW, and LPPROCESS_INFORMATION variables. I tried replicating them with struct and using the table linked above but that didn't really work either, just giving me memory access errors all around.
Once I got into the memory allocation management part of trying to replicate string pointers I just gave up and decided on the interop exe way.