我在使用IIS部署非托管dll时遇到问题。
我已阅读Embedding unmanaged dll into a managed C# dll但我不想嵌入我的二进制文件,因为我需要系统可扩展。
编辑以阐明可扩展性为了降低构建到我的库的插件的复杂性,我希望人们能够将包含非托管文件的二进制文件放到bin文件夹中并集中管理。
我还阅读Unmanaged DLLs fail to load on ASP.NET server但我无法手动将文件复制到PATH可见文件夹。
使用下面的代码我尝试将非托管二进制文件镜像到执行文件夹,然后P / Invoke LoadLibrary
方法将它们加载到内存中。
当它命中File.Copy
时会抛出以下错误。
Access to the path 'MyPath\bin\x86' is denied.
有没有一个可靠的方法来做到这一点?我很难找到任何连贯的信息。我无法手动更改IIS权限,因为这是可以安装在任何地方的库的一部分。
我也不能用<hostingEnvironment shadowCopyBinAssemblies="false" />
我的代码
private void RegisterNativeBinaries()
{
if (NativeBinaries.Any())
{
return;
}
string folder = Is64Bit ? "x64" : "x86";
string sourcePath =
HttpContext.Current.Server.MapPath("~/bin/" + folder);
Assembly assembly = Assembly.GetExecutingAssembly();
string targetBasePath = new Uri(assembly.Location).LocalPath;
DirectoryInfo directoryInfo = new DirectoryInfo(sourcePath);
if (directoryInfo.Exists)
{
foreach (FileInfo fileInfo in directoryInfo
.EnumerateFiles("*.dll"))
{
if (fileInfo.Name.ToUpperInvariant()
.StartsWith("IMAGEPROCESSOR"))
{
IntPtr pointer;
string targetPath = Path.GetFullPath(
Path.Combine(targetBasePath, "..\\" + folder + "\\" + fileInfo.Name));
// This is where the error is thrown.
File.Copy(sourcePath, targetPath, true);
try
{
// Load the binary into memory.
pointer = NativeMethods.LoadLibrary(sourcePath);
}
catch (Exception ex)
{
throw new ApplicationException(ex.Message);
}
if (pointer == IntPtr.Zero)
{
throw new ApplicationException(
"Cannot load " + fileInfo.Name);
}
// Store the pointer for freeing later.
NativeBinaries.Add(pointer);
}
}
}
}