A examples/csharp-dllexport/DllExportInjector/App.config => examples/csharp-dllexport/DllExportInjector/App.config +6 -0
@@ 0,0 1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+ <startup>
+ <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
+ </startup>
+</configuration><
\ No newline at end of file
A examples/csharp-dllexport/DllExportInjector/DllExportInjector.csproj => examples/csharp-dllexport/DllExportInjector/DllExportInjector.csproj +111 -0
@@ 0,0 1,111 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProjectGuid>{E1F2D7C1-C50E-4146-AB92-D0F9B889F4FC}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <RootNamespace>DllExportInjector</RootNamespace>
+ <AssemblyName>DllExportInjector</AssemblyName>
+ <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+ <Deterministic>true</Deterministic>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup>
+ <ApplicationManifest>app.manifest</ApplicationManifest>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+ <DebugSymbols>true</DebugSymbols>
+ <OutputPath>bin\x64\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <DebugType>full</DebugType>
+ <PlatformTarget>x64</PlatformTarget>
+ <LangVersion>7.3</LangVersion>
+ <ErrorReport>prompt</ErrorReport>
+ <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+ <Prefer32Bit>true</Prefer32Bit>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+ <OutputPath>bin\x64\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <Optimize>true</Optimize>
+ <DebugType>pdbonly</DebugType>
+ <PlatformTarget>x64</PlatformTarget>
+ <LangVersion>7.3</LangVersion>
+ <ErrorReport>prompt</ErrorReport>
+ <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+ <Prefer32Bit>true</Prefer32Bit>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+ <DebugSymbols>true</DebugSymbols>
+ <OutputPath>bin\x86\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <DebugType>full</DebugType>
+ <PlatformTarget>x86</PlatformTarget>
+ <LangVersion>7.3</LangVersion>
+ <ErrorReport>prompt</ErrorReport>
+ <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+ <Prefer32Bit>true</Prefer32Bit>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+ <OutputPath>bin\x86\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <Optimize>true</Optimize>
+ <DebugType>pdbonly</DebugType>
+ <PlatformTarget>x86</PlatformTarget>
+ <LangVersion>7.3</LangVersion>
+ <ErrorReport>prompt</ErrorReport>
+ <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+ <Prefer32Bit>true</Prefer32Bit>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Net.Http" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Program.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="App.config" />
+ <None Include="app.manifest" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\..\DllUtils\DllUtils.csproj">
+ <Project>{70b2af2e-bfd2-48c9-9d13-18053f26e710}</Project>
+ <Name>DllUtils</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\DllExportLibrary\DllExportLibrary.csproj">
+ <Project>{1cbaadb6-2b35-4010-96cc-17ba4b1caf8e}</Project>
+ <Name>DllExportLibrary</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project><
\ No newline at end of file
A examples/csharp-dllexport/DllExportInjector/Program.cs => examples/csharp-dllexport/DllExportInjector/Program.cs +107 -0
@@ 0,0 1,107 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using DllUtils;
+using DllUtils.Attributes;
+using DllUtils.Memory;
+using DllUtils.Modules;
+using DllUtils.Process;
+
+namespace DllExportInjector
+{
+ class Program
+ {
+
+ // To pass string in parameter CustomFunctionParams must be used
+ // This will work only with cpp, in csharp unsafe struct is needed
+ [CustomFunctionParams(EncodingType.ASCII)]
+ public struct MyFunctionParams
+ {
+ [ParamPosition(0)]
+ public string Param;
+
+ [ParamPosition(1)]
+ public int Number;
+ }
+
+ [StructLayout(LayoutKind.Sequential, Pack = 1)]
+ public class AddParams
+ {
+ [MarshalAs(UnmanagedType.I4)]
+ public int First;
+
+ [MarshalAs(UnmanagedType.I4)]
+ public int Second;
+ }
+
+ static void Main(string[] args)
+ {
+ Console.WriteLine("Welcome to CsharpInjector demo for DllExport library");
+ Console.WriteLine("Just a small reminder - you cannot inject to every process using this injector");
+ Console.WriteLine("Be sure to inject only to processes that match process configuration you use for this project (x86, x64)");
+
+ Console.Write("Put in name (without .exe) or id of the process you want to inject in: ");
+ string read = Console.ReadLine();
+ RemoteProcessHandle processHandle;
+
+ if (int.TryParse(read, out int processId))
+ {
+ processHandle = Injector.GetRemoteProcess(processId);
+ }
+ else
+ {
+ processHandle = Injector.GetRemoteProcess(read);
+ }
+
+ if (processHandle == null)
+ {
+ Console.WriteLine("Process not found.");
+ Console.Read();
+ return;
+ }
+
+ string dllPath = "DllExportLibrary.dll";
+ if (!File.Exists(dllPath))
+ {
+ Console.WriteLine("Dll to inject not found.");
+ }
+
+ InjectedModule injectedModule = processHandle.Inject(dllPath);
+ Console.WriteLine("Module injected");
+
+ Console.WriteLine("Calling Main function to alloc console");
+ FunctionResult result = injectedModule.ExecuteFunction("Main");
+ int mainResult = result.To<int>();
+
+ Console.WriteLine($"Result from main: {mainResult} (should be 1)");
+
+ Console.WriteLine($"Sleeping for 1 second");
+ Thread.Sleep(1000);
+
+ // Execute addition function and get its params
+ Console.WriteLine("Calling Addition with params of 10 and 5; Expected result: 15");
+ result = injectedModule.ExecuteFunction("Add", new AddParams
+ {
+ First = 5,
+ Second = 10
+ });
+
+ int additionResult = result.To<int>();
+ Console.WriteLine("Result: " + additionResult);
+
+ injectedModule.ExecuteFunction("MyFunction", new MyFunctionParams
+ {
+ Param = "Injected string!",
+ Number = 1000
+ });
+
+ injectedModule.Process.Close();
+ Console.ReadLine();
+ }
+ }
+}
A examples/csharp-dllexport/DllExportInjector/Properties/AssemblyInfo.cs => examples/csharp-dllexport/DllExportInjector/Properties/AssemblyInfo.cs +36 -0
@@ 0,0 1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("DllExportInjector")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("DllExportInjector")]
+[assembly: AssemblyCopyright("Copyright © 2020")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a paramType in this assembly from
+// COM, set the ComVisible attribute to true on that paramType.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("e1f2d7c1-c50e-4146-ab92-d0f9b889f4fc")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
A examples/csharp-dllexport/DllExportInjector/app.manifest => examples/csharp-dllexport/DllExportInjector/app.manifest +76 -0
@@ 0,0 1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
+ <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
+ <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
+ <security>
+ <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
+ <!-- UAC Manifest Options
+ If you want to change the Windows User Account Control level replace the
+ requestedExecutionLevel node with one of the following.
+
+ <requestedExecutionLevel level="asInvoker" uiAccess="false" />
+ <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
+ <requestedExecutionLevel level="highestAvailable" uiAccess="false" />
+
+ Specifying requestedExecutionLevel element will disable file and registry virtualization.
+ Remove this element if your application requires this virtualization for backwards
+ compatibility.
+ -->
+ <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
+ </requestedPrivileges>
+ </security>
+ </trustInfo>
+
+ <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+ <application>
+ <!-- A list of the Windows versions that this application has been tested on
+ and is designed to work with. Uncomment the appropriate elements
+ and Windows will automatically select the most compatible environment. -->
+
+ <!-- Windows Vista -->
+ <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
+
+ <!-- Windows 7 -->
+ <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
+
+ <!-- Windows 8 -->
+ <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
+
+ <!-- Windows 8.1 -->
+ <!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
+
+ <!-- Windows 10 -->
+ <!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
+
+ </application>
+ </compatibility>
+
+ <!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher
+ DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need
+ to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should
+ also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config. -->
+ <!--
+ <application xmlns="urn:schemas-microsoft-com:asm.v3">
+ <windowsSettings>
+ <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
+ </windowsSettings>
+ </application>
+ -->
+
+ <!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
+ <!--
+ <dependency>
+ <dependentAssembly>
+ <assemblyIdentity
+ type="win32"
+ name="Microsoft.Windows.Common-Controls"
+ version="6.0.0.0"
+ processorArchitecture="*"
+ publicKeyToken="6595b64144ccf1df"
+ language="*"
+ />
+ </dependentAssembly>
+ </dependency>
+ -->
+
+</assembly>
A examples/csharp-dllexport/DllExportLibrary/DllExportLibrary.csproj => examples/csharp-dllexport/DllExportLibrary/DllExportLibrary.csproj +133 -0
@@ 0,0 1,133 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProjectGuid>{1CBAADB6-2B35-4010-96CC-17BA4B1CAF8E}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>DllExportLibrary</RootNamespace>
+ <AssemblyName>DllExportLibrary</AssemblyName>
+ <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <Deterministic>true</Deterministic>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ </PropertyGroup>
+ <PropertyGroup>
+ <DllExportIdent>A59D0183-CCF9-4FE7-B6F7-F7C0B9BAECDF</DllExportIdent>
+ <DllExportMetaLibName>DllExport.dll</DllExportMetaLibName>
+ <DllExportNamespace>DllExportLibrary</DllExportNamespace>
+ <DllExportDDNSCecil>true</DllExportDDNSCecil>
+ <PlatformTarget>x86</PlatformTarget>
+ <DllExportOrdinalsBase>6</DllExportOrdinalsBase>
+ <DllExportGenExpLib>false</DllExportGenExpLib>
+ <DllExportOurILAsm>false</DllExportOurILAsm>
+ <DllExportSysObjRebase>false</DllExportSysObjRebase>
+ <DllExportLeaveIntermediateFiles>false</DllExportLeaveIntermediateFiles>
+ <DllExportTimeout>30000</DllExportTimeout>
+ <DllExportPeCheck>2</DllExportPeCheck>
+ <DllExportPatches>0</DllExportPatches>
+ <DllExportPreProcType>0</DllExportPreProcType>
+ <DllExportPostProcType>0</DllExportPostProcType>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+ <DebugSymbols>true</DebugSymbols>
+ <OutputPath>bin\x64\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <DebugType>full</DebugType>
+ <PlatformTarget>x64</PlatformTarget>
+ <LangVersion>7.3</LangVersion>
+ <ErrorReport>prompt</ErrorReport>
+ <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+ <OutputPath>bin\x64\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <Optimize>true</Optimize>
+ <DebugType>pdbonly</DebugType>
+ <PlatformTarget>x64</PlatformTarget>
+ <LangVersion>7.3</LangVersion>
+ <ErrorReport>prompt</ErrorReport>
+ <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+ <DebugSymbols>true</DebugSymbols>
+ <OutputPath>bin\x86\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <DebugType>full</DebugType>
+ <PlatformTarget>x86</PlatformTarget>
+ <LangVersion>7.3</LangVersion>
+ <ErrorReport>prompt</ErrorReport>
+ <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+ <OutputPath>bin\x86\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <Optimize>true</Optimize>
+ <DebugType>pdbonly</DebugType>
+ <PlatformTarget>x86</PlatformTarget>
+ <LangVersion>7.3</LangVersion>
+ <ErrorReport>prompt</ErrorReport>
+ <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="DllExport, PublicKeyToken=8337224c9ad9e356">
+ <HintPath>$(SolutionDir)examples\csharp-dllexport\packages\DllExport.1.7.1\gcache\$(DllExportMetaXBase)\$(DllExportNamespace)\$(DllExportMetaLibName)</HintPath>
+ <Private>False</Private>
+ <SpecificVersion>False</SpecificVersion>
+ </Reference>
+ <Reference Include="System" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Net.Http" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Export.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <PackageReference Include="DllExport">
+ <Version>1.7.1</Version>
+ <Visible>false</Visible>
+ <Wz>1</Wz>
+ </PackageReference>
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <ImportGroup Label=".NET DllExport">
+ <Import Project="$(SolutionDir)examples\csharp-dllexport\packages\DllExport.1.7.1\tools\net.r_eg.DllExport.targets" Condition="Exists($([MSBuild]::Escape('$(SolutionDir)examples\csharp-dllexport\packages\DllExport.1.7.1\tools\net.r_eg.DllExport.targets')))" Label="8337224c9ad9e356" />
+ </ImportGroup>
+ <Target Name="DllExportRestorePkg" BeforeTargets="PrepareForBuild">
+ <Error Condition="!Exists('$(SolutionDir)DllExport.bat')" Text="DllExport.bat is not found. Path: '$(SolutionDir)' - https://github.com/3F/DllExport" />
+ <Exec Condition="('$(DllExportModImported)' != 'true' Or !Exists('$(SolutionDir)examples\csharp-dllexport\packages\DllExport.1.7.1\tools\net.r_eg.DllExport.targets')) And Exists('$(SolutionDir)DllExport.bat')" Command=".\DllExport.bat -action Restore" WorkingDirectory="$(SolutionDir)" />
+ </Target>
+ <Target Name="DllExportRPkgDynamicImport" BeforeTargets="PostBuildEvent" DependsOnTargets="GetFrameworkPaths" Condition="'$(DllExportModImported)' != 'true' And '$(DllExportRPkgDyn)' != 'false'">
+ <MSBuild BuildInParallel="true" UseResultsCache="true" Projects="$(MSBuildProjectFullPath)" Properties="DllExportRPkgDyn=true" Targets="Build" />
+ </Target>
+</Project><
\ No newline at end of file
A examples/csharp-dllexport/DllExportLibrary/Export.cs => examples/csharp-dllexport/DllExportLibrary/Export.cs +75 -0
@@ 0,0 1,75 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DllExportLibrary
+{
+ public static class Export
+ {
+ [DllImport("kernel32.dll", SetLastError = true)]
+ public static extern IntPtr AllocConsole();
+
+ public unsafe struct MyFunctionParams
+ {
+ public byte* Param;
+ public int Number;
+ }
+
+
+ [StructLayout(LayoutKind.Sequential, Pack = 1)]
+ public class AddParams
+ {
+ [MarshalAs(UnmanagedType.I4)]
+ public int First;
+
+ [MarshalAs(UnmanagedType.I4)]
+ public int Second;
+ }
+
+ [DllExport]
+ public static void MyFunction(IntPtr pars)
+ {
+ Console.WriteLine("Hello from injected dll Export::MyFunction!");
+
+ unsafe
+ {
+ byte[] bytes = new byte[64];
+ int i = 0;
+
+ MyFunctionParams* myParams = (MyFunctionParams*) pars;
+
+ byte* param = myParams->Param - 1;
+
+ while (*(++param) != 0)
+ {
+ bytes[i++] = *param;
+ }
+
+ string ascii = Encoding.ASCII.GetString(bytes);
+
+ Console.WriteLine($"The passed param is: {ascii}");
+ Console.WriteLine($"Random number passed: {myParams->Number}");
+ }
+ }
+
+ [DllExport]
+ public static int Main()
+ {
+ AllocConsole();
+ Console.WriteLine("Hello from injected dll Export::Main!");
+
+ return 1;
+ }
+
+ [DllExport]
+ public static int Add(AddParams pars)
+ {
+ Console.WriteLine($"Performing addition of numbers {pars.First} and {pars.Second}");
+
+ return pars.First + pars.Second;
+ }
+ }
+}
A examples/csharp-dllexport/DllExportLibrary/Properties/AssemblyInfo.cs => examples/csharp-dllexport/DllExportLibrary/Properties/AssemblyInfo.cs +36 -0
@@ 0,0 1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("DllExportLibrary")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("DllExportLibrary")]
+[assembly: AssemblyCopyright("Copyright © 2020")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("1cbaadb6-2b35-4010-96cc-17ba4b1caf8e")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]