1

WebApplication の gPRC バージョンを 0.12.0 から 0.13.0 に更新したところオブジェクトの作成に失敗し始めました。スローされる例外は次のとおりです。Channel

ここに画像の説明を入力

に位置付けようとしてgrpc_csharp_ext.dllいますAppData\\Local\\Temp\\Temporary ASP.NET Files\\root\\c8490d1a\\9f150f28\\assembly\\dl3\\5d08d985\\2c1c8757_6474d101\\nativelibs\\windows_x86\\grpc_csharp_ext.dll。DLLをローカルbinフォルダーに保存しましたが、それは役に立ちませんでした。コンソール アプリを作成すると、この問題は発生しません。上記の場所でdllを検索しようとしている理由がわかりませんか? Webアプリケーションで機能させる方法を知っている人はいますか?

編集この問題は、リンクに従って GRPC コミュニティによって修正されています。私も同じことを確認しました。ここで、(32 ビット dll の場合) と(64 ビット dll の場合)のgrpc_csharp_ext.dll下を保持する必要があります。bin\nativelibs\windows_x86\bin\nativelibs\windows_x64\

4

1 に答える 1

0

Asp.net は、動的コンパイル中にシャドウ コピー アセンブリを実行します。Grpc.Core.dll をコピーしますが、ネイティブgrpc_csharp_ext.dllファイルを含むフォルダーnativelibsはコピーしません。プログラムでnativelibsフォルダーに対処することで、この問題を解決しました。

Global.asax の Application_Start から copy メソッドを呼び出します。

public class WebApplication : HttpApplication
{
    protected void Application_Start()
    {
        GrpcInitializer.EnsureGrpcCSharpExtNativeDll();
    }
}

コピー機:

public static class GrpcInitializer
{
    public static void EnsureGrpcCSharpExtNativeDll()
    {
        var grpcCoreAssembly = Assembly.GetAssembly(typeof(Grpc.Core.Channel));
        var srcFolderPath = Path.GetDirectoryName(new Uri(grpcCoreAssembly.CodeBase).LocalPath);

        CopyGrpcCSharpExtNativeDll(srcFolderPath);
    }

    public static void CopyGrpcCSharpExtNativeDll(string srcFolderPath)
    {
        var grpcCoreAssembly = Assembly.GetAssembly(typeof(Grpc.Core.Channel));
        var grpcDllLocation = Path.GetDirectoryName(grpcCoreAssembly.Location);
        if (grpcDllLocation == null)
            return;

        var targetFolderPath = Path.Combine(grpcDllLocation, "nativelibs");
        if (Directory.Exists(targetFolderPath))
            return;

        srcFolderPath = Path.Combine(srcFolderPath, "nativelibs");

        DirectoryCopy(srcFolderPath, targetFolderPath, true);
    }

    private static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs)
    {
        if (string.IsNullOrEmpty(sourceDirName) || string.IsNullOrEmpty(destDirName))
        {
            throw new ArgumentNullException(
                $"Directory paths cannot be empty. sourceDirName: {sourceDirName} | destDirName: {destDirName}");
        }

        var dir = new DirectoryInfo(sourceDirName);
        if (!dir.Exists)
        {
            throw new DirectoryNotFoundException("Source directory does not exist or could not be found: " +
                                                 sourceDirName);
        }

        var dirs = dir.GetDirectories();
        if (!Directory.Exists(destDirName))
        {
            Directory.CreateDirectory(destDirName);
        }

        var files = dir.GetFiles();
        foreach (var file in files)
        {
            string temppath = Path.Combine(destDirName, file.Name);
            file.CopyTo(temppath, false);
        }

        if (copySubDirs)
        {
            foreach (var subdir in dirs)
            {
                var temppath = Path.Combine(destDirName, subdir.Name);
                DirectoryCopy(subdir.FullName, temppath, true);
            }
        }
    }
}
于 2016-03-28T11:47:24.590 に答える