32 أو 64 بت تحميل DLL من .صافي التعليمات البرمجية المدارة

StackOverflow https://stackoverflow.com/questions/377181

  •  22-08-2019
  •  | 
  •  

سؤال

لدي DLL غير (على scilexer.dll من الشرارة محرر التعليمات البرمجية ، وتستخدم من قبل Scintilla.Net من CodePlex) التي يتم تحميلها من تطبيق تتم إدارته الحوض الصغير Scintilla.Net المكون.ويندوز تمكنت التطبيق يعمل بدون مشكلة على كل من 32 و 64 بت البيئات ، ولكن أنا بحاجة إلى إنشاء مختلف المنشآت التي يستخدم 64 أو 32 scilexer.dll.

هل هناك طريقة لتوزيع كل من دلس في 32 و 64 بت تنسيق بحيث DLL محمل من .Net framework تحميل DLL غير في 32 أو 64 بت تنسيق اعتمادا على بعض .config الخيار أو بعض "اسم مسار السحر" ؟

هل كانت مفيدة؟

المحلول

يستخدم

وP / استدعاء LoadLibrary تحميل دلس، وإذا كان هناك بالفعل مكتبة محملة اسم معين، وفشل LoadLibrary إعادته. حتى إذا كنت يمكن أن تعطي كلا الإصدارين من DLL يحمل نفس الاسم، ولكن وضعها في دلائل مختلفة، يمكنك أن تفعل شيئا من هذا القبيل مرة واحدة فقط قبل مكالمتك الأولى إلى وظيفة من scilexer.dll، دون الحاجة إلى تكرار الإعلانات خارجي الخاص بك:

    string platform = IntPtr.Size == 4 ? "x86" : "x64";
    string dll = installDir + @"\lib-" + platform + @"\scilexer.dll";
    if (LoadLibrary(dll) == IntPtr.Zero)
        throw new IOException("Unable to load " + dll + ".");

نصائح أخرى

للأسف، أنا لا أعرف شيئا عن هذا DLL معين. ومع ذلك، عند قيام P / استدعاء نفسك، ويمكنك التعامل مع القليل من الازدواجية، فمن الممكن لخلق وكيل واحد لكل منصة.

وعلى سبيل المثال، لنفترض أن لديك واجهة التالية، التي يجب أن تنفذها إما DLL 32 أو 64 بت:

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

وإنشاء وكلاء:

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);
    }
}

و

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);
    }
}

وأخيرا جعل مصنع أن يختار واحد حق لك:

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;
    }
}

وكما يتم تحميل دلس بتكاسل أول مرة يتم التذرع بها، وهذا يعمل في الواقع، على الرغم من كل منصة التمكن من تحميل الإصدار الذي هو مواطن له فقط. انظر هذه المقالة للحصول على شرح أكثر تفصيلا.

أفضل جئت بها هي التالية:

  • توزيع طلبي مع اثنين من دلس اسمه 64 أو 32
  • الرئيسية بدء تشغيل التعليمات البرمجية التالية:
    
    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");
        }
    }

ويمكنك وضع دلل في SYSTEM32. بت 32 في syswow64 و64 بت في SYSTEM32 الحقيقي. 32 بت، عندما تاي SYSTEM32 الوصول يتم توجيه لهم Syswow64.

ويمكنك إنشاء إدخال في التسجيل. مفتاح البرنامج لديه فرعي اسمه Wow6432Node أن تطبيق 32 بت يرى كمفتاح البرمجيات.

وهنا هو ما <لأ href = "https://blogs.msdn.com/powershell/archive/2007/01/09/behind-powershell-installer-for-windows-xp-windows-server-2003.aspx "يختلط =" نوفولو noreferrer "> بوويرشيل المثبت لا .

ويمكن تثبيت دلس غير المدارة في GAC جنبا إلى جنب مع نظرائهم إدارتها. هذه المقالة يجب أن توضح كيف يعمل.

scroll top