[c#] إلميرج بديل، كيفية تضمين دلز التابعة للتطبيق في ملف إيكس؟



Answers

لعبت مع هذا مؤخرا، بدءا من هذا أو قطعة مشابهة جدا من التعليمات البرمجية، وأعتقد أن بناء resourceName خطأ. حاول وضع نقطة توقف في بداية طريقة التصميم ثم قم بالاتصال ب GetManifestResourceNames() على المجموعة المنفذة لمعرفة الاسم الذي تعطيه بالفعل الموارد المضمنة.

أظن أنه من المحتمل "dlls.Functions.Shared" وهكذا دواليك بدلا من "AssemblyLoadingAndReflection.Functions.Shared"

Question

كما ذكر هنا إم محاولة تضمين دلس في تطبيق إيكس لتوزيع واحد فقط إكس، ولكن عندما أحاول تشغيل طلبي على جهاز زب مع كامل. نيت 4 تثبيته فقط تعطل مع أي خطأ، أنا وضع ما يلي رمز على الطريقة الرئيسية

[STAThread]
        static void Main()
        {
            AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
            {
                String resourceName = "AssemblyLoadingAndReflection." + new AssemblyName(args.Name).Name + ".dll";

                using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
                {
                    Byte[] assemblyData = new Byte[stream.Length];
                    stream.Read(assemblyData, 0, assemblyData.Length);
                    return Assembly.Load(assemblyData);
                }
            };

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new frmrPrincipal());
        }

لدي مجلد يسمى دلس حيث وضع إم

Functions.Shared.dll
Alex.UI.dll
Alex.Controls.dll

و إم إعداد العمل بناء على "الموارد المضمنة".

إذا أنا إزالة تلك القطعة من التعليمات البرمجية وتعيين دلز ليتم تضمينها عن طريق النقر مرة واحدة المثبت أنه يعمل بشكل جيد. راجع للشغل باستخدام .NET فريميورك 4 الملف الشخصي الكامل و VS2010 SP1




أظن أنك تحاول تحميل دلل مع رمز غير مدار. ل دلز المدارة مجرد قراءة وتحميل التجمع في الذاكرة سوف تفعل أو يمكنك تحميل من موقع معين دون حتى القراءة. لمجموعات وضع مختلطة، كان لي النجاح فقط عن طريق كتابة وحدات البايت إلى ملف وتحميل من موقعه.

class Program
{
    [STAThread]
    static void Main()
    {
        AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
        {
            string assemblyName = new AssemblyName(args.Name).Name;
            if (assemblyName.EndsWith(".resources"))
                return null;

            string dllName = assemblyName + ".dll";
            string dllFullPath = Path.Combine(GetMyApplicationSpecificPath(), dllName);

            using (Stream s = Assembly.GetEntryAssembly().GetManifestResourceStream(typeof(Program).Namespace + ".Resources." + dllName))
            {
                byte[] data = new byte[stream.Length];
                s.Read(data, 0, data.Length);

                //or just byte[] data = new BinaryReader(s).ReadBytes((int)s.Length);

                File.WriteAllBytes(dllFullPath, data);
            }

            return Assembly.LoadFrom(dllFullPath);
        };

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new frmrPrincipal());
    }
}

حيث يكون Program هو اسم الفئة. لتجنب مشكلة الدجاج والبيض، يجب عليك التأكد من أنك تعلن عن المعالج قبل الوصول إلى التجمع وأنك ال تستطيع الوصول إلى أعضاء التجمع) أو إنشاء أي شيء يجب أن يتعامل مع الجمعية (داخل جزء التحميل) حل التجميع (. أيضا الحرص على ضمان GetMyApplicationSpecificPath() ليس أي دليل تيمب منذ ملفات تيمب يمكن محاولة للحصول على محوها من قبل برامج أخرى أو من قبل نفسك (وليس ذلك سوف تحصل على حذفها بينما البرنامج الخاص بك هو الوصول إلى دل، ولكن على الأقل إزعاج. أبداتا هو موقع جيد). نلاحظ أيضا أن لديك لكتابة بايت في كل مرة، كنت غير قادر فقط تحميل من موقع فقط "كوس دلل يقيم بالفعل هناك.




Links