mirror of
https://github.com/chibicitiberiu/rainmeter-studio.git
synced 2024-02-24 04:33:31 +00:00
DllExporter: Move under Build\ directory
Also makes InputText use an architecture specific version of DllExporter.
This commit is contained in:
parent
580d6de303
commit
351fcbce5d
@ -1,7 +1,7 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
[assembly: AssemblyCopyright("© 2013 - Birunthan Mohanathas")]
|
||||
[assembly: AssemblyVersion("1.0.1.0")]
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
[assembly: AssemblyCopyright("© 2013 - Birunthan Mohanathas")]
|
||||
[assembly: AssemblyVersion("1.0.1.0")]
|
||||
[assembly: AssemblyProduct("Rainmeter")]
|
@ -1,94 +1,82 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{49D56CA5-54AB-45C9-A245-EAE588FCBFE1}</ProjectGuid>
|
||||
<OutputType>Exe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>DllExporter</RootNamespace>
|
||||
<AssemblyName>DllExporter</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<PublishUrl>publish\</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Disk</InstallFrom>
|
||||
<UpdateEnabled>false</UpdateEnabled>
|
||||
<UpdateMode>Foreground</UpdateMode>
|
||||
<UpdateInterval>7</UpdateInterval>
|
||||
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||
<UpdatePeriodically>false</UpdatePeriodically>
|
||||
<UpdateRequired>false</UpdateRequired>
|
||||
<MapFileExtensions>true</MapFileExtensions>
|
||||
<ApplicationRevision>0</ApplicationRevision>
|
||||
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<NoWarn>1607</NoWarn>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<DebugType>none</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<NoWarn>1607</NoWarn>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
|
||||
</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>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<NoWarn>1607</NoWarn>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<OutputPath>bin\x64\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>none</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<NoWarn>1607</NoWarn>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.Build.Utilities.v4.0" />
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>if not exist "$(SolutionDir)Plugins\API\DllExporter.exe" (move "$(TargetPath)" "$(SolutionDir)Plugins\API\DllExporter.exe")</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{49D56CA5-54AB-45C9-A245-EAE588FCBFE1}</ProjectGuid>
|
||||
<OutputType>Exe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>DllExporter</RootNamespace>
|
||||
<AssemblyName>DllExporter</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<PublishUrl>publish\</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Disk</InstallFrom>
|
||||
<UpdateEnabled>false</UpdateEnabled>
|
||||
<UpdateMode>Foreground</UpdateMode>
|
||||
<UpdateInterval>7</UpdateInterval>
|
||||
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||
<UpdatePeriodically>false</UpdatePeriodically>
|
||||
<UpdateRequired>false</UpdateRequired>
|
||||
<MapFileExtensions>true</MapFileExtensions>
|
||||
<ApplicationRevision>0</ApplicationRevision>
|
||||
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
<OutputPath Condition=" '$(Platform)' == 'x86' ">$(SolutionDir)x32-$(Configuration)\Tools\</OutputPath>
|
||||
<OutputPath Condition=" '$(Platform)' == 'x64' ">$(SolutionDir)x64-$(Configuration)\Tools\</OutputPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<NoWarn>1607</NoWarn>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<DebugType>none</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<NoWarn>1607</NoWarn>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<NoWarn>1607</NoWarn>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>none</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<NoWarn>1607</NoWarn>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.Build.Utilities.v4.0" />
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
@ -1,233 +1,241 @@
|
||||
/*
|
||||
Copyright (C) 2011 Birunthan Mohanathas
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Diagnostics;
|
||||
using Microsoft.Build.Utilities;
|
||||
using System.IO;
|
||||
|
||||
namespace DllExporter
|
||||
{
|
||||
class Program
|
||||
{
|
||||
static int Main(string[] args)
|
||||
{
|
||||
string configurationName = args[0];
|
||||
string platformTarget = args[1];
|
||||
string targetDirectory = args[2];
|
||||
string targetDllName = targetDirectory + args[3];
|
||||
string targetIlName = targetDllName + ".il";
|
||||
string targetResName = targetDllName + ".res";
|
||||
|
||||
bool is64 = platformTarget.ToLower().Equals("x64");
|
||||
bool isDebug = configurationName.ToLower().Equals("debug");
|
||||
|
||||
string ilasmPath = FindIlasmPath(is64);
|
||||
if (ilasmPath == null)
|
||||
{
|
||||
Console.WriteLine("DllExporter error: ilasm.exe not found");
|
||||
return 1;
|
||||
}
|
||||
|
||||
string ildasmPath = FindIldasmPath();
|
||||
if (ildasmPath == null)
|
||||
{
|
||||
Console.WriteLine("DllExporter error: ildasm.exe not found");
|
||||
return 1;
|
||||
}
|
||||
|
||||
Directory.SetCurrentDirectory(targetDirectory);
|
||||
|
||||
// Disassemble
|
||||
Process ildasmProc = new Process();
|
||||
string ildasmArgs = string.Format(
|
||||
"/nobar {0} /output=\"{1}\" \"{2}\"",
|
||||
isDebug ? "/linenum" : "",
|
||||
targetIlName,
|
||||
targetDllName);
|
||||
|
||||
ildasmProc.StartInfo = new ProcessStartInfo(ildasmPath, ildasmArgs);
|
||||
ildasmProc.StartInfo.UseShellExecute = false;
|
||||
ildasmProc.StartInfo.CreateNoWindow = false;
|
||||
ildasmProc.StartInfo.RedirectStandardOutput = true;
|
||||
ildasmProc.Start();
|
||||
ildasmProc.WaitForExit();
|
||||
|
||||
if (ildasmProc.ExitCode != 0)
|
||||
{
|
||||
Console.WriteLine("DllExporter error: Unable to disassemble!");
|
||||
Console.WriteLine(ildasmProc.StandardOutput.ReadToEnd());
|
||||
return ildasmProc.ExitCode;
|
||||
}
|
||||
|
||||
bool hasResource = File.Exists(targetResName);
|
||||
|
||||
// Read disassembly and find methods marked with DllExport attribute
|
||||
List<string> lines = new List<string>(File.ReadAllLines(targetIlName));
|
||||
int attributeIndex = 0;
|
||||
int exportCount = 0;
|
||||
while (true)
|
||||
{
|
||||
attributeIndex = lines.FindIndex(attributeIndex, new Predicate<string>(x => x.Contains(".custom instance void") && x.Contains("DllExport::.ctor()")));
|
||||
if (attributeIndex < 8) break;
|
||||
|
||||
int methodIndex = lines.FindLastIndex(attributeIndex, attributeIndex, new Predicate<string>(x => x.Contains(".method")));
|
||||
if (methodIndex == -1)
|
||||
{
|
||||
Console.WriteLine("DllExporter error: Unable to parse disassembly (.method not found)!");
|
||||
return 1;
|
||||
}
|
||||
|
||||
int functionIndex = lines.FindIndex(methodIndex, new Predicate<string>(x => x.Contains("(")));
|
||||
if (functionIndex == -1)
|
||||
{
|
||||
Console.WriteLine("DllExporter error: Unable to parse disassembly (bracket not found)!");
|
||||
return 1;
|
||||
}
|
||||
|
||||
int bracketPos = lines[functionIndex].IndexOf('(');
|
||||
int functionNamePos = lines[functionIndex].LastIndexOf(' ', bracketPos);
|
||||
string functionName = lines[functionIndex].Substring(functionNamePos, bracketPos - functionNamePos);
|
||||
|
||||
// Change calling convention to cdecl
|
||||
lines[functionIndex] = string.Format("{0} modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) {1}", lines[functionIndex].Substring(0, functionNamePos - 1), lines[functionIndex].Substring(functionNamePos));
|
||||
|
||||
int attributeBeginPos = lines[attributeIndex].IndexOf('.');
|
||||
string spaces = new string(' ', attributeBeginPos);
|
||||
|
||||
// Replace attribute with export
|
||||
++exportCount;
|
||||
lines[attributeIndex] = string.Format("{0}.export [{1}] as {2}", spaces, exportCount, functionName);
|
||||
|
||||
++attributeIndex;
|
||||
}
|
||||
|
||||
if (exportCount == 0)
|
||||
{
|
||||
Console.WriteLine("DllExporter warning: Nothing found to export.");
|
||||
}
|
||||
|
||||
// Remove the DllExport class
|
||||
int classIndex = lines.FindIndex(new Predicate<string>(x => x.Contains(".class ") && x.EndsWith(".DllExport")));
|
||||
if (classIndex == -1)
|
||||
{
|
||||
Console.WriteLine("DllExporter error: Unable to parse disassembly (DllExport class not found)!");
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
int classEndIndex = lines.FindIndex(classIndex, new Predicate<string>(x => x.Contains("} // end of class") && x.EndsWith(".DllExport")));
|
||||
if (classEndIndex == -1)
|
||||
{
|
||||
Console.WriteLine("DllExporter error: Unable to parse disassembly (DllExport class end not found)!");
|
||||
return 1;
|
||||
}
|
||||
|
||||
lines.RemoveRange(classIndex, classEndIndex - classIndex + 2);
|
||||
}
|
||||
|
||||
// Write everything back
|
||||
File.WriteAllLines(targetIlName, lines.ToArray());
|
||||
|
||||
// Reassemble
|
||||
Process ilasmProc = new Process();
|
||||
string resource = hasResource ? string.Format("/resource=\"{0}\"", targetResName) : "";
|
||||
string ilasmArgs = string.Format("/nologo /quiet /dll {0} {1} /output=\"{2}\" {3} \"{4}\"", isDebug ? "/debug /pdb" : "/optimize", is64 ? "/x64 /PE64" : "", targetDllName, resource, targetIlName);
|
||||
ilasmProc.StartInfo = new ProcessStartInfo(ilasmPath, ilasmArgs);
|
||||
ilasmProc.StartInfo.UseShellExecute = false;
|
||||
ilasmProc.StartInfo.CreateNoWindow = false;
|
||||
ilasmProc.StartInfo.RedirectStandardOutput = true;
|
||||
ilasmProc.Start();
|
||||
ilasmProc.WaitForExit();
|
||||
|
||||
if (ilasmProc.ExitCode != 0)
|
||||
{
|
||||
Console.WriteLine("DllExporter error: Unable to assemble!");
|
||||
Console.WriteLine(ilasmProc.StandardOutput.ReadToEnd());
|
||||
return ilasmProc.ExitCode;
|
||||
}
|
||||
|
||||
// Cleanup
|
||||
File.Delete(targetIlName);
|
||||
File.Delete(targetResName);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Finds path to ilasm.exe.
|
||||
/// </summary>
|
||||
private static string FindIlasmPath(bool x64)
|
||||
{
|
||||
var arch = x64 ? DotNetFrameworkArchitecture.Bitness64 : DotNetFrameworkArchitecture.Bitness32;
|
||||
var path = ToolLocationHelper.GetPathToDotNetFrameworkFile(
|
||||
"ilasm.exe", TargetDotNetFrameworkVersion.Version20, arch);
|
||||
return File.Exists(path) ? path : null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Finds path to ildasm.exe.
|
||||
/// </summary>
|
||||
private static string FindIldasmPath()
|
||||
{
|
||||
var sdkPath = Environment.ExpandEnvironmentVariables(@"%ProgramFiles%\Microsoft SDKs\Windows\");
|
||||
if (!Directory.Exists(sdkPath))
|
||||
{
|
||||
sdkPath = Environment.ExpandEnvironmentVariables(@"%ProgramFiles(x86)%\Microsoft SDKs\Windows\");
|
||||
}
|
||||
|
||||
if (!Directory.Exists(sdkPath))
|
||||
{
|
||||
throw new DirectoryNotFoundException("'Microsoft SDKs' directory not found");
|
||||
}
|
||||
|
||||
// Get the version directories.
|
||||
var sdkVersionDirectories = Directory.GetDirectories(sdkPath);
|
||||
foreach (var sdkVersionDirectory in sdkVersionDirectories)
|
||||
{
|
||||
var binDirectory = Path.Combine(sdkVersionDirectory, @"bin");
|
||||
if (!Directory.Exists(binDirectory))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check for e.g. 'Microsoft SDKs\v8.0A\bin\ildasm.exe'.
|
||||
var ildasmPath = Path.Combine(binDirectory, @"ildasm.exe");
|
||||
if (File.Exists(ildasmPath))
|
||||
{
|
||||
return ildasmPath;
|
||||
}
|
||||
|
||||
// Check for e.g. 'Microsoft SDKs\v8.0A\bin\NETFX 4.0 Tools\ildasm.exe'.
|
||||
var toolsDirectories = Directory.GetDirectories(binDirectory, "NETFX*Tools");
|
||||
foreach (var toolDirectory in toolsDirectories)
|
||||
{
|
||||
ildasmPath = Path.Combine(toolDirectory, @"ildasm.exe");
|
||||
if (File.Exists(ildasmPath))
|
||||
{
|
||||
return ildasmPath;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
Copyright (C) 2011 Birunthan Mohanathas
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Diagnostics;
|
||||
using Microsoft.Build.Utilities;
|
||||
using System.IO;
|
||||
|
||||
namespace DllExporter
|
||||
{
|
||||
class Program
|
||||
{
|
||||
static int Main(string[] args)
|
||||
{
|
||||
if (args.Length < 4)
|
||||
{
|
||||
Console.WriteLine("DllExporter error: Invalid arguments");
|
||||
return 1;
|
||||
}
|
||||
|
||||
string configurationName = args[0];
|
||||
string platformTarget = args[1];
|
||||
string targetDirectory = args[2];
|
||||
string targetDllName = targetDirectory + args[3];
|
||||
string targetIlName = targetDllName + ".il";
|
||||
string targetResName = targetDllName + ".res";
|
||||
|
||||
bool is64 = platformTarget.ToLower().Equals("x64");
|
||||
bool isDebug = configurationName.ToLower().Equals("debug");
|
||||
|
||||
string ilasmPath = FindIlasmPath(is64);
|
||||
if (ilasmPath == null)
|
||||
{
|
||||
Console.WriteLine("DllExporter error: ilasm.exe not found");
|
||||
return 1;
|
||||
}
|
||||
|
||||
string ildasmPath = FindIldasmPath();
|
||||
if (ildasmPath == null)
|
||||
{
|
||||
Console.WriteLine("DllExporter error: ildasm.exe not found");
|
||||
return 1;
|
||||
}
|
||||
|
||||
Directory.SetCurrentDirectory(targetDirectory);
|
||||
|
||||
// Disassemble
|
||||
Process ildasmProc = new Process();
|
||||
string ildasmArgs = string.Format(
|
||||
"/nobar {0} /output=\"{1}\" \"{2}\"",
|
||||
isDebug ? "/linenum" : "",
|
||||
targetIlName,
|
||||
targetDllName);
|
||||
|
||||
ildasmProc.StartInfo = new ProcessStartInfo(ildasmPath, ildasmArgs);
|
||||
ildasmProc.StartInfo.UseShellExecute = false;
|
||||
ildasmProc.StartInfo.CreateNoWindow = false;
|
||||
ildasmProc.StartInfo.RedirectStandardOutput = true;
|
||||
ildasmProc.Start();
|
||||
ildasmProc.WaitForExit();
|
||||
|
||||
if (ildasmProc.ExitCode != 0)
|
||||
{
|
||||
Console.WriteLine("DllExporter error: Unable to disassemble!");
|
||||
Console.WriteLine(ildasmProc.StandardOutput.ReadToEnd());
|
||||
return ildasmProc.ExitCode;
|
||||
}
|
||||
|
||||
bool hasResource = File.Exists(targetResName);
|
||||
|
||||
// Read disassembly and find methods marked with DllExport attribute
|
||||
List<string> lines = new List<string>(File.ReadAllLines(targetIlName));
|
||||
int attributeIndex = 0;
|
||||
int exportCount = 0;
|
||||
while (true)
|
||||
{
|
||||
attributeIndex = lines.FindIndex(attributeIndex, new Predicate<string>(x => x.Contains(".custom instance void") && x.Contains("DllExport::.ctor()")));
|
||||
if (attributeIndex < 8) break;
|
||||
|
||||
int methodIndex = lines.FindLastIndex(attributeIndex, attributeIndex, new Predicate<string>(x => x.Contains(".method")));
|
||||
if (methodIndex == -1)
|
||||
{
|
||||
Console.WriteLine("DllExporter error: Unable to parse disassembly (.method not found)!");
|
||||
return 1;
|
||||
}
|
||||
|
||||
int functionIndex = lines.FindIndex(methodIndex, new Predicate<string>(x => x.Contains("(")));
|
||||
if (functionIndex == -1)
|
||||
{
|
||||
Console.WriteLine("DllExporter error: Unable to parse disassembly (bracket not found)!");
|
||||
return 1;
|
||||
}
|
||||
|
||||
int bracketPos = lines[functionIndex].IndexOf('(');
|
||||
int functionNamePos = lines[functionIndex].LastIndexOf(' ', bracketPos);
|
||||
string functionName = lines[functionIndex].Substring(functionNamePos, bracketPos - functionNamePos);
|
||||
|
||||
// Change calling convention to cdecl
|
||||
lines[functionIndex] = string.Format("{0} modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) {1}", lines[functionIndex].Substring(0, functionNamePos - 1), lines[functionIndex].Substring(functionNamePos));
|
||||
|
||||
int attributeBeginPos = lines[attributeIndex].IndexOf('.');
|
||||
string spaces = new string(' ', attributeBeginPos);
|
||||
|
||||
// Replace attribute with export
|
||||
++exportCount;
|
||||
lines[attributeIndex] = string.Format("{0}.export [{1}] as {2}", spaces, exportCount, functionName);
|
||||
|
||||
++attributeIndex;
|
||||
}
|
||||
|
||||
if (exportCount == 0)
|
||||
{
|
||||
Console.WriteLine("DllExporter warning: Nothing found to export.");
|
||||
}
|
||||
|
||||
// Remove the DllExport class
|
||||
int classIndex = lines.FindIndex(new Predicate<string>(x => x.Contains(".class ") && x.EndsWith(".DllExport")));
|
||||
if (classIndex == -1)
|
||||
{
|
||||
Console.WriteLine("DllExporter error: Unable to parse disassembly (DllExport class not found)!");
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
int classEndIndex = lines.FindIndex(classIndex, new Predicate<string>(x => x.Contains("} // end of class") && x.EndsWith(".DllExport")));
|
||||
if (classEndIndex == -1)
|
||||
{
|
||||
Console.WriteLine("DllExporter error: Unable to parse disassembly (DllExport class end not found)!");
|
||||
return 1;
|
||||
}
|
||||
|
||||
lines.RemoveRange(classIndex, classEndIndex - classIndex + 2);
|
||||
}
|
||||
|
||||
// Write everything back
|
||||
File.WriteAllLines(targetIlName, lines.ToArray());
|
||||
|
||||
// Reassemble
|
||||
Process ilasmProc = new Process();
|
||||
string resource = hasResource ? string.Format("/resource=\"{0}\"", targetResName) : "";
|
||||
string ilasmArgs = string.Format("/nologo /quiet /dll {0} {1} /output=\"{2}\" {3} \"{4}\"", isDebug ? "/debug /pdb" : "/optimize", is64 ? "/x64 /PE64" : "", targetDllName, resource, targetIlName);
|
||||
ilasmProc.StartInfo = new ProcessStartInfo(ilasmPath, ilasmArgs);
|
||||
ilasmProc.StartInfo.UseShellExecute = false;
|
||||
ilasmProc.StartInfo.CreateNoWindow = false;
|
||||
ilasmProc.StartInfo.RedirectStandardOutput = true;
|
||||
ilasmProc.Start();
|
||||
ilasmProc.WaitForExit();
|
||||
|
||||
if (ilasmProc.ExitCode != 0)
|
||||
{
|
||||
Console.WriteLine("DllExporter error: Unable to assemble!");
|
||||
Console.WriteLine(ilasmProc.StandardOutput.ReadToEnd());
|
||||
return ilasmProc.ExitCode;
|
||||
}
|
||||
|
||||
// Cleanup
|
||||
File.Delete(targetIlName);
|
||||
File.Delete(targetResName);
|
||||
|
||||
Console.WriteLine("DllExporter: Processed {0}", args[3]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Finds path to ilasm.exe.
|
||||
/// </summary>
|
||||
private static string FindIlasmPath(bool x64)
|
||||
{
|
||||
var arch = x64 ? DotNetFrameworkArchitecture.Bitness64 : DotNetFrameworkArchitecture.Bitness32;
|
||||
var path = ToolLocationHelper.GetPathToDotNetFrameworkFile(
|
||||
"ilasm.exe", TargetDotNetFrameworkVersion.Version20, arch);
|
||||
return File.Exists(path) ? path : null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Finds path to ildasm.exe.
|
||||
/// </summary>
|
||||
private static string FindIldasmPath()
|
||||
{
|
||||
var sdkPath = Environment.ExpandEnvironmentVariables(@"%ProgramFiles%\Microsoft SDKs\Windows\");
|
||||
if (!Directory.Exists(sdkPath))
|
||||
{
|
||||
sdkPath = Environment.ExpandEnvironmentVariables(@"%ProgramFiles(x86)%\Microsoft SDKs\Windows\");
|
||||
}
|
||||
|
||||
if (!Directory.Exists(sdkPath))
|
||||
{
|
||||
throw new DirectoryNotFoundException("'Microsoft SDKs' directory not found");
|
||||
}
|
||||
|
||||
// Get the version directories.
|
||||
var sdkVersionDirectories = Directory.GetDirectories(sdkPath);
|
||||
foreach (var sdkVersionDirectory in sdkVersionDirectories)
|
||||
{
|
||||
var binDirectory = Path.Combine(sdkVersionDirectory, @"bin");
|
||||
if (!Directory.Exists(binDirectory))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check for e.g. 'Microsoft SDKs\v8.0A\bin\ildasm.exe'.
|
||||
var ildasmPath = Path.Combine(binDirectory, @"ildasm.exe");
|
||||
if (File.Exists(ildasmPath))
|
||||
{
|
||||
return ildasmPath;
|
||||
}
|
||||
|
||||
// Check for e.g. 'Microsoft SDKs\v8.0A\bin\NETFX 4.0 Tools\ildasm.exe'.
|
||||
var toolsDirectories = Directory.GetDirectories(binDirectory, "NETFX*Tools");
|
||||
foreach (var toolDirectory in toolsDirectories)
|
||||
{
|
||||
ildasmPath = Path.Combine(toolDirectory, @"ildasm.exe");
|
||||
if (File.Exists(ildasmPath))
|
||||
{
|
||||
return ildasmPath;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -97,9 +97,9 @@
|
||||
<DependentUpon>InputBox.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<Import Project="$(SolutionDir)Build\VS\RainmeterPlugin.Cs.props"/>
|
||||
<Import Project="$(SolutionDir)Build\VS\RainmeterPlugin.Cs.props" />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>"$(SolutionDir)Plugins\API\DllExporter.exe" "$(ConfigurationName)" "$(PlatformName)" "$(TargetDir)\" "$(TargetFileName)"</PostBuildEvent>
|
||||
<PostBuildEvent>"$(RmOutDirRoot)Tools\DllExporter.exe" "$(ConfigurationName)" "$(PlatformName)" "$(TargetDir)\" "$(TargetFileName)"</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
</Project>
|
@ -9,6 +9,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common", "Common\Common.vcx
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common_Test", "Common\Common_Test.vcxproj", "{442084A6-2069-4927-B0C9-51525A720CB2}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DllExporter", "Build\DllExporter\DllExporter.csproj", "{49D56CA5-54AB-45C9-A245-EAE588FCBFE1}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Installer", "Installer\Installer.vcxproj", "{2FCFBFD2-2720-4BDD-B620-4BDD3DBB8D3D}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Language", "Language\Language.vcxproj", "{6BE6F228-B741-4DA9-9FBC-E9F2A7BD483A}"
|
||||
@ -32,8 +34,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SkinInstallerLauncher", "Sk
|
||||
{6F5D4C4A-C8C3-41DA-BF44-6D42B76464DA} = {6F5D4C4A-C8C3-41DA-BF44-6D42B76464DA}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DllExporter", "Plugins\API\DllExporter\DllExporter.csproj", "{49D56CA5-54AB-45C9-A245-EAE588FCBFE1}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PluginAdvancedCPU", "Plugins\PluginAdvancedCPU\PluginAdvancedCPU.vcxproj", "{EE8EC522-8430-4B46-86A3-D943D77F9E4B}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PluginCoreTemp", "Plugins\PluginCoreTemp\PluginCoreTemp.vcxproj", "{F32FA418-8DF4-4E94-B92B-EBD502F5DC07}"
|
||||
@ -43,6 +43,9 @@ EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PluginFolderInfo", "Plugins\PluginFolderInfo\PluginFolderInfo.vcxproj", "{A221819D-4263-42AA-B22A-C022924842A7}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PluginInputText", "Plugins\PluginInputText\PluginInputText.csproj", "{2CFEC79A-E39E-4FFD-ABC2-C4A69DD1E44D}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{49D56CA5-54AB-45C9-A245-EAE588FCBFE1} = {49D56CA5-54AB-45C9-A245-EAE588FCBFE1}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PluginiTunes", "Plugins\PluginiTunes\PluginiTunes.vcxproj", "{A2DD3CBE-B140-4892-A875-24107FA52518}"
|
||||
EndProject
|
||||
|
Loading…
Reference in New Issue
Block a user