Giter VIP home page Giter VIP logo

dllexport's Introduction

DllExport

Unmanaged Exports ( .NET DllExport )

Copyright (c) 2009-2015  Robert Giesecke
Copyright (c) 2016-2017  Denis Kuzmin <[email protected]>

Build status NuGet package License

[DllExport("Init", CallingConvention.Cdecl)]
public static int entrypoint(IntPtr L)
{
    // ... it will be called from Lua script

    lua_pushcclosure(L, onProc, 0);
    lua_setglobal(L, "onKeyDown");

    return 0;
}
  • For work with Unmanaged code/libraries (binding between .NET and C/C++ etc.), see Conari
  • If you need convenient work with Lua (5.1, 5.2, 5.3, ...), see LunaRoad
[DllExport("Init", CallingConvention.Cdecl)]
// __cdecl is the default calling convention for our library as and for C and C++ programs
[DllExport(CallingConvention.StdCall)]
[DllExport("MyFunc")]
[DllExport]

Support of Modules: Library (.dll) and Executable (.exe) [?]

Where to look ? v1.2+ provides dynamic definitions of namespaces (ddNS feature), thus you can use what you want - details here

    Via Cecil or direct modification:

    Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

    000005B0                 00 C4 7B 01 00 00 00 2F 00 12 05       .ร„{..../...
    000005C0  00 00 02 00 00 00 00 00 00 00 00 00 00 00 26 00  ..............&.
    000005D0  20 02 00 00 00 00 00 00 00 49 2E 77 61 6E 74 2E   ........I.want.   <<<-
    000005E0  74 6F 2E 66 6C 79 00 00 00 00 00 00 00 00 00 00  to.fly..........  <<<-


Initially the original tool UnmanagedExports was distributed by Robert Giesecke as an closed-source tool under the MIT License:

Now, we will be more open ! all details here

License

It still under the MIT License (MIT) - be a free and open

&

How it works

Current features has been implemented through ILDasm & ILAsm that does the all required steps via .export directive.

What inside ? or how works the .export directive ?

Read about format PE32/PE32+, start with grammar from asmparse and move to writer:

...
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 ~

or read my short explanations from here: DllMain & the export-table; DllExport.dll; .exp & .lib; ordinals ...

How to get DllExport

Available variants:

  • NuGet PM: Install-Package DllExport
  • GetNuTool: msbuild gnt.core /p:ngpackages="DllExport" or gnt /p:ngpackages="DllExport"
  • NuGet Commandline: nuget install DllExport
  • /releases ( latest )
  • Nightly builds (/artifacts page). But remember: It can be unstable or not work at all. Use this for tests of latest changes.

How to Build

No requires additional steps for you, just build as you need.

Use build.bat if you need final NuGet package as a DllExport.<version>.nupkg etc.

  • You do not need to do anything inside IDE if you have installed this plugin.

How to Debug

For example, find the DllExport.MSBuild project in solution:

  • Properties > Debug:
    • Start Action: set as Start External program
      • Add full path to msbuild.exe, for example: C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe
    • Start Options > Command line arguments write for example:
"<path_to_SolutionFile_for_debugging>.sln" /t:Build /p:Configuration=<Configuration>

use additional Diagnostic key to msbuild if you need details from .targets

"<path_to_SolutionFile_for_debugging>.sln" /verbosity:Diagnostic /t:Rebuild /p:Configuration=<Configuration>

Go to Start Debugging. Now you can debug at runtime.

coreclr - ILAsm / ILDasm

We use our custom versions of coreclr, special for DllExport project - https://github.com/3F/coreclr

This helps to avoid some problems (like this) and more...

To build minimal version (means that it does not include all components as for original coreclr repo):

git submodule update --init --recursive

Make sure that you have installed CMake, then build simply:

build_s all x86 x64 Release
build_s x86 Release

or use

build_coreclr_x86.cmd
build_coreclr_x86_x64.cmd

You can also use our binaries of coreclr separately if needed:


Support ?

just a note again... I mentioned earlier that DllExport is not priority for me (current impl.) "- I will do something from current tasks, but guys, please support it with me" and... why so many support from me o_o

dllexport's People

Contributors

3f avatar aarnott avatar

Stargazers

 avatar

Forkers

crogarox

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.