add InstanceDll
This commit is contained in:
parent
76731ba0e7
commit
18aeefb66a
|
@ -63,6 +63,7 @@
|
||||||
<Compile Include="Extensions\ReflectionExtensions.cs" />
|
<Compile Include="Extensions\ReflectionExtensions.cs" />
|
||||||
<Compile Include="Extensions\StringExtensions.cs" />
|
<Compile Include="Extensions\StringExtensions.cs" />
|
||||||
<Compile Include="HawkFile.cs" />
|
<Compile Include="HawkFile.cs" />
|
||||||
|
<Compile Include="InstanceDll.cs" />
|
||||||
<Compile Include="IPC\IPCRingBuffer.cs" />
|
<Compile Include="IPC\IPCRingBuffer.cs" />
|
||||||
<Compile Include="IPC\SharedMemoryBlock.cs" />
|
<Compile Include="IPC\SharedMemoryBlock.cs" />
|
||||||
<Compile Include="Log.cs" />
|
<Compile Include="Log.cs" />
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace BizHawk.Common
|
||||||
|
{
|
||||||
|
public class InstanceDll : IDisposable
|
||||||
|
{
|
||||||
|
public InstanceDll(string dllPath)
|
||||||
|
{
|
||||||
|
//copy the dll to a temp directory
|
||||||
|
var path = Path.Combine(Path.GetTempPath(), "instancedll-pid" + System.Diagnostics.Process.GetCurrentProcess().Id + "-" + Guid.NewGuid()) + "-" + Path.GetFileName(dllPath);
|
||||||
|
using (var stream = new FileStream(path, FileMode.Create, System.Security.AccessControl.FileSystemRights.FullControl, FileShare.ReadWrite | FileShare.Delete, 4 * 1024, FileOptions.None))
|
||||||
|
using (var sdll = File.OpenRead(dllPath))
|
||||||
|
sdll.CopyTo(stream);
|
||||||
|
|
||||||
|
_hModule = LoadLibrary(path);
|
||||||
|
var newfname = Path.GetFileName(path);
|
||||||
|
newfname = "bizhawk.bizdelete-" + newfname;
|
||||||
|
var newpath = Path.Combine(Path.GetDirectoryName(path), newfname);
|
||||||
|
File.Move(path, newpath);
|
||||||
|
}
|
||||||
|
|
||||||
|
[DllImport("kernel32.dll")]
|
||||||
|
static extern IntPtr LoadLibrary(string dllToLoad);
|
||||||
|
[DllImport("kernel32.dll")]
|
||||||
|
static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
|
||||||
|
[DllImport("kernel32.dll")]
|
||||||
|
static extern bool FreeLibrary(IntPtr hModule);
|
||||||
|
|
||||||
|
public IntPtr GetProcAddress(string procName)
|
||||||
|
{
|
||||||
|
return GetProcAddress(_hModule, procName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
if (_hModule != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
FreeLibrary(_hModule);
|
||||||
|
_hModule = IntPtr.Zero;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IntPtr _hModule;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue