Ander wenke

Ongelukkig het ek weet niks van hierdie spesifieke DLL weet. Maar wanneer jy die P doen / Roep jouself, en jy kan gaan met 'n bietjie duplisering, is dit moontlik om 'n gevolmagtigde te skep vir elke platform.

Byvoorbeeld, veronderstel dat jy die volgende interface, wat geïmplementeer moet word deur óf 'n 32 of 64 bit DLL:

public interface ICodec {
    int Decode(IntPtr input, IntPtr output, long inputLength);
}

Jy skep die gevolmagtigdes:

public class CodecX86 : ICodec {
    private const string dllFileName = @"Codec.x86.dll";

    [DllImport(dllFileName)]
    static extern int decode(IntPtr input, IntPtr output, long inputLength);

    public int Decode(IntPtr input, IntPtr output, long inputLength) {
        return decode(input, output, inputLength);
    }
}

en

public class CodecX64 : ICodec {
    private const string dllFileName = @"Codec.x64.dll";

    [DllImport(dllFileName)]
    static extern int decode(IntPtr input, IntPtr output, long inputLength);

    public int Decode(IntPtr input, IntPtr output, long inputLength) {
        return decode(input, output, inputLength);
    }
}

En uiteindelik maak 'n fabriek wat die regte een vir jou tel:

public class CodecFactory {
    ICodec instance = null;

    public ICodec GetCodec() {
        if (instance == null) {
            if (IntPtr.Size == 4) {
                instance = new CodecX86();
            } else if (IntPtr.Size == 8) {
                instance = new CodecX64();
            } else {
                throw new NotSupportedException("Unknown platform");
            }
        }
        return instance;
    }
}

As die DLLs lui is gelaai die eerste keer dat hulle word opgeroep, hierdie eintlik werk, ten spyte van elke platform net in staat is om die weergawe wat is inheems aan dit te laai. Sien hierdie artikel vir 'n meer gedetailleerde verduideliking.

Die beste wat ek vorendag te kom met die volgende:

  • Versprei my aansoek met twee DLLs vernoem 64 of 32
  • In die belangrikste opstart kode sluit die volgende in:
    
    File.Delete(Application.StartupPath + @"\scilexer.dll");
    {
      // Check for 64 bit and copy the proper scilexer dll
        if (IntPtr.Size == 4)
        {
          File.Copy(Application.StartupPath + @"\scilexer32.dll",
            Application.StartupPath + @"\scilexer.dll");
        }
        else
        {
          File.Copy(Application.StartupPath + @"\scilexer64.dll",
            Application.StartupPath + @"\scilexer.dll");
        }
    }

Jy kan die dll sit in system32. Die 32 bit in SysWow64 en die 64 bit in die werklike system32. Vir 32 bit aansoek, wanneer thay toegang system32 hulle getrek het om SysWow64.

Jy kan 'n inskrywing in die register te skep. Die sagteware sleutel het 'n subsleutel met die naam Wow6432Node dat 32 bit aansoek te sien as die sagteware sleutel.

Hier is wat Powershell installeerder doen .

Onbestuurde dlls geïnstalleer kan word in die GAC side-by-kant met hul bestuur eweknieë. Hierdie artikel moet verduidelik hoe dit werk.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top