
Security News
Open Source Maintainers Feeling the Weight of the EUโs Cyber Resilience Act
The EU Cyber Resilience Act is prompting compliance requests that open source maintainers may not be obligated or equipped to handle.
Open source .NET DllExport with .NET Core support (aka 3F/DllExport aka DllExport.bat) https://github.com/3F/DllExport ๐ Quick start: https://github.com/3F/DllExport/wiki/Quick-start ๐ Examples. Unmanaged C++ / C# / Java: https://youtu.be/QXMj9-8XJnY ๐งช Demo: https://github.com/3F/Examples/tree/master/DllExport/BasicExport * https://github.com/3F/DllExport/tree/master/src/DllExport/assets https://github.com/3F/DllExport/tree/master/src/DllExport/UnitedTest === DllExport -dxp-version 1.8.1 https://3F.github.io/DllExport/releases/latest/manager/ === gnt DllExport/1.8.1 https://github.com/3F/GetNuTool .NET DllExport 1.8.1+c2d3cd1 Configuration: PublicRelease Release type: Build number: 36569 toolset: net40 MetaCor: netstandard1.1 MetaLib: net20 hMSBuild core: 2.4.1 :: generated by a vsSolutionBuildEvent 1.16.1.32816
.NET DllExport with .NET Core support (aka 3F/DllExport aka DllExport.bat)
[DllExport("Init", CallingConvention.Cdecl)]
[DllExport(CallingConvention.StdCall)]
// Cdecl is the default calling convention in .NET DllExport
[DllExport("MyFunc")]
[DllExport]
Based on UnmanagedExports that was created by Robert Giesecke. His page.
.NET DllExport is a different project that was developed by Denis Kuzmin ใ โ ใ
Copyright (c) 2009-2015 Robert Giesecke
Copyright (c) 2016-2025 Denis Kuzmin <x-3F@outlook.com> github/3F
[ Quick start ] [ Examples: C++, C#, Java, ... ] -> { Wiki } { ๐งช Demo }
Example of using DllExport + Conari:
[DllExport] // DllExportModifiedClassLibrary.dll
public static IntPtr callme(TCharPtr str, IntPtr structure)
{
if(str != "Hello world!") return IntPtr.Zero;
structure.Native().f<int>("x", "y").build(out dynamic v);
if(v.x > v.y)
{
structure.Access().write<int>(8);
}
return new NativeArray<int>(-1, v.x, 1, v.y);
}
... // host side via C/C++, Java, Rust, Python, ... or even same dotnet C#
using NativeString<TCharPtr> ns = new("Hello world!");
using NativeStruct<Arg> nstruct = new(new Arg() { x = 7, y = 5 });
using dynamic l = new ConariX("DllExportModifiedClassLibrary.dll");
IntPtr ptr = l.callme<IntPtr>(ns, nstruct);
using NativeArray<int> nr = new(4, ptr); // (nstruct.Data.x == 8) != (nr[1] == 7)
For Lua, consider using LuNari
[DllExport]
public static int entrypoint(IntPtr L)
{
using Lua<ILua53> lua = new("Lua.dll");
...
lua.pushcclosure(L, onProc, 0);
lua.setglobal(L, "onKeyDown");
LuaNumber num = lua.tonumber<LuaNumber>(L, 7);
...
}
.NET DllExport supports both Library (.dll) and Executable (.exe) PE modules.
Current features has been implemented through ILDasm & ILAsm that prepares all the necessary steps via .export
directive (it's part of the ILAsm compiler, not CLR).
What inside ? how does work the .export directive ?
Read about format PE32/PE32+, start with grammar from asmparse and move to writer:
...
//yacc
if(PASM->m_pCurMethod->m_dwExportOrdinal == 0xFFFFFFFF)
{
PASM->m_pCurMethod->m_dwExportOrdinal = $3;
PASM->m_pCurMethod->m_szExportAlias = $6;
if(PASM->m_pCurMethod->m_wVTEntry == 0) PASM->m_pCurMethod->m_wVTEntry = 1;
if(PASM->m_pCurMethod->m_wVTSlot == 0) PASM->m_pCurMethod->m_wVTSlot = $3 + 0x8000;
}
...
EATEntry* pEATE = new EATEntry;
pEATE->dwOrdinal = pMD->m_dwExportOrdinal;
pEATE->szAlias = pMD->m_szExportAlias ? pMD->m_szExportAlias : pMD->m_szName;
pEATE->dwStubRVA = EmitExportStub(pGlobalLabel->m_GlobalOffset+dwDelta);
m_EATList.PUSH(pEATE);
...
// logic of definition of records into EXPORT_DIRECTORY (see details from PE format)
HRESULT Assembler::CreateExportDirectory()
{
...
IMAGE_EXPORT_DIRECTORY exportDirIDD;
DWORD exportDirDataSize;
BYTE *exportDirData;
EATEntry *pEATE;
unsigned i, L, ordBase = 0xFFFFFFFF, Ldllname;
...
~ now we're ready to miracles ~ vtfxup thunk stubs and ~...
Read also my brief explanations here: AssemblyRef encoding / about mscoree / DllMain & the export-table / DllExport.dll / ordinals ...
Does DllExport support NuGet ?
Most likely yes. But NuGet features are not guaranteed (tl;dr something may not work or not work properly)
Use directly latest stable DllExport.bat (~28 KB). Read Wiki
Read [ Documentation ]
git clone https://github.com/3F/DllExport.git DllExport
cd DllExport
Call build.bat to build final binaries like DllExport.<version>.nupkg
, Manager, tests, zip-archives, and related:
.\build Release
Note, this relies on vsSolutionBuildEvent scripting if you're using Visual Studio IDE.
We're using 3F's modified versions specially for .NET DllExport project
This helps to avoid some problems like this, or this, and more ...
To build minimal version:
.\build # ilasm -x64
Make sure you have installed CMake before build.
To build assembler and use exactly this compiled version with DllExport, command like:
.\build # ilasm -x64 & .\build Release
Alternatively you can get official compiled versions via
Or like:
.tools\gnt ILAsm & .\build Release
FAQs
Open source .NET DllExport with .NET Core support (aka 3F/DllExport aka DllExport.bat) https://github.com/3F/DllExport ๐ Quick start: https://github.com/3F/DllExport/wiki/Quick-start ๐ Examples. Unmanaged C++ / C# / Java: https://youtu.be/QXMj9-8XJnY ๐งช Demo: https://github.com/3F/Examples/tree/master/DllExport/BasicExport * https://github.com/3F/DllExport/tree/master/src/DllExport/assets https://github.com/3F/DllExport/tree/master/src/DllExport/UnitedTest === DllExport -dxp-version 1.8.1 https://3F.github.io/DllExport/releases/latest/manager/ === gnt DllExport/1.8.1 https://github.com/3F/GetNuTool .NET DllExport 1.8.1+c2d3cd1 Configuration: PublicRelease Release type: Build number: 36569 toolset: net40 MetaCor: netstandard1.1 MetaLib: net20 hMSBuild core: 2.4.1 :: generated by a vsSolutionBuildEvent 1.16.1.32816
We found that dllexport demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.ย It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
The EU Cyber Resilience Act is prompting compliance requests that open source maintainers may not be obligated or equipped to handle.
Security News
Crates.io adds Trusted Publishing support, enabling secure GitHub Actions-based crate releases without long-lived API tokens.
Research
/Security News
Undocumented protestware found in 28 npm packages disrupts UI for Russian-language users visiting Russian and Belarusian domains.