在IIS中正确部署非托管二进制文件

时间:2014-07-07 14:16:50

标签: c# asp.net .net iis dllimport

我在使用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);
                }
            }
        }
    }

0 个答案:

没有答案