الإجراء المخصص في C# المستخدمة عبر WIX فشل مع خطأ 1154

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

سؤال

أنا أستخدم WIX 3.5.1930 في Visual Studio 2010 ، مستهدفًا .NET Framework 3.5. (يبدو أن المباني الأسبوعية اللاحقة لـ WIX مكسورة للغاية فيما يتعلق بقالب العمل المخصص الخاص بهم ، على الأقل في الوقت الحالي. 1930 هو أحدث بناء يبدو أنه يصنع C# ca مع مراجع عمل.)

لديّ تجمعان مخصصان مكتوبان في C#. واحد منهم يعمل بشكل جيد. فشل الآخر مع الخطأ التالي:

CustomActionnNameHere returned actual error code 1154 (note this may not be 100% accurate if translation happened inside sandbox)

لقد قارنت ملفات .csproj وملفات .wixproj ، وبأفضل أفضل ما يمكنني قول أن الاختلافات مناسبة (على سبيل المثال قائمة ملفات .CS المضمنة). لقد غيرت. wxs غير المجال للاتصال بالإجراء المخصص العاملة بدلاً من الإجراء المخصص غير العاملة ويعمل على أنه epxected.

ماذا يمكنني أن أنظر للحصول على هذا العمل؟

تحرير: فقط ليكون كاملة 1154 يشير إلى DLL غير صالح - Net HelpmsG يترجمه (باللغة الإنجليزية) إلى "أحد ملفات المكتبة اللازمة لتشغيل هذا التطبيق تالف."

التحرير الثاني: Run Peverify مقابل DLL (أمسك نسخة من Windows Installer أثناء تشغيل المثبت) ويقول إن كل شيء على ما يرام في DLL. يحتوي DLL على طريقة الإجراء المخصصة فقط مع "نجاح الإرجاع" ، لذا لا يوجد الكثير حتى تتحقق منه ، لكنه يؤكد أن DLL غير فاسد.

تحرير ثالث: يتبع الرمز في الإجراء المخصص المكسور:

using Microsoft.Deployment.WindowsInstaller;

namespace Framework.Installer.Database {
    public class CustomActions {

        [CustomAction]
        public static ActionResult RunMigration(Session session) {

            return ActionResult.Success;
        }

    }
}

ليس كثيرا. الأجزاء ذات الصلة من .wxs هي كما يلي:

<InstallExecuteSequence>
  <Custom Action="DotNetMigratorCustomActionPreviousUp" After="SetMigrationPropertiesPreviousUp"><![CDATA[(&Database = 3)]]></Custom>
</InstallExecuteSequence>

<Binary Id="DotNetMigratorCustomActionDll"
        SourceFile="$(var.Framework.Installer.Database.CustomActions.TargetDir)\SoftwareAnswers.Framework.Installer.Database.CustomActions.dll" />

<CustomAction Id="DotNetMigratorCustomActionPreviousUp"
              Return="check"
              BinaryKey="DotNetMigratorCustomActionDll"
              DllEntry="RunMigration"
              Execute="deferred" />
هل كانت مفيدة؟

المحلول

يبدو أنك تستخدم DTF. إذا رأيت:

using Microsoft.Deployment.WindowsInstaller;

ثم أنت بالتأكيد. تأكد من قراءة ما يلي لكيفية عمل كل شيء:

إدارة أدوات النشر (DTF) الإجراءات المخصصة

ستجد أيضًا مساعدة DTF CHM في قائمة START ضمن WIX.

في الأساس ، يبدو الأمر بالنسبة لي ، فأنت تقوم بتوصيل مجموعة .NET إلى المثبت بدلاً من DLL غير المغطى. اقرأ المقال أعلاه للحصول على نظرة عامة على كيفية النظر إليها في الأمر يعتمد ومعرفة ما يمكن توقعه. ويكس | C# يجب أن يخرج مشروع الإجراء المخصص foo.dll و foo.ca.dll. تريد لاحقا في المثبت الخاص بك.

بالنسبة للأشخاص الذين يهبطون في هذه الصفحة في المستقبل (كانت الإجابة في الأصل للملصق) هناك قائمة كاملة بالأشياء التي يجب التحقق منها:

  1. هل تشير إلى DLL الصحيح في الجدول الثنائي؟
  2. هل تشير إلى اسم الوظيفة المصدرة الصحيح؟
  3. هل صفك العام؟
  4. هل طريقتك باستخدام التوقيع الصحيح؟ أي هو:
  5. تم وضع علامة على سمة CustomAction الصحيحة
  6. تم وضع علامة عليه كجمهور؟
  7. تم وضع علامة ثابتة؟
  8. إرجاع ActionResult؟
  9. خذ جلسة كحجة؟
  10. تأكد من أنك تستخدم نوع مشروع الإجراء المخصص لـ Wix C# لضمان استدعاء حدث PostBuild لإنشاء غلاف DLL الأصلي. (انظر #1)

أي واحد من هذه يمكن أن يسبب خطأ 1154. هذا هو السبب في أنني كتبت مقالًا شاملاً للمدونة حول هذا الموضوع وربطه في هذه الإجابة. من المهم أن نفهم تمامًا كيفية تقديم التعليمات البرمجية المدارة إلى خدمة تثبيت Windows غير المدارة ومعرفة كيفية استخدامها على التحقق من صحة أن الطريقة الثابتة العامة يتم تصديرها كدالة STDCALL في .CA.DLL الناتجة التي تنتجها WIX/DTF.

نصائح أخرى

إذا قمت بإنشاء الإجراء المخصص الخاص بك في Visual Studio (نذري) ، فتأكد من أنك قمت بإنشاء مشروع عمل Wix Custon وليس مكتبة الفصل ، وإلا يجب عليك استخدام أداة MakeFXCA لتعبئة الإجراء المخصص الخاص بك.

لقد وجدت نفس المشكلة (باستخدام ملف .ca.dll الصحيح) وفي حالتي ، كان ذلك لأنني لم أستخدم طريقة ثابتة. كان لدي هذا:

public ActionResult MyMethod(Session session)

بدلا من هذا:

public static ActionResult MyMethod(Session session)

بعد تغيير الطريقة التي عملت بشكل جيد.

آمل أن يساعد شخص ما.

لقد ضربت سببًا بسيطًا للغاية (وغبي) سبب للخطأ 1154: أخطأ اسم إدخال DLL في عنصر CustomAction ...

مقارنة الأسباب المختلفة التي وجدها الآخرون ، يبدو لي أن الخطأ 1154 يعني في معظم الحالات ، "إدخال DLL غير موجود".

سبب آخر رأيت هذا الخطأ هو أنني نسيت إضافة السمة [CustomAction] إلى اسم وظيفة C#.

في حالتي كان طول اسم الوظيفة. كان 27 حرفًا ، وكنا نحصل على الخطأ. قمنا بتغيير اسم الوظيفة إلى 24 حرفًا ، وقد نجحت.

حاول وضع مكالمة الإجراءات المخصصة في

<InstallExecuteSequence/>

على أمل الحصول على رسالة خطأ أفضل. لقد تلقيت رسائل خطأ مختلفة اعتمادًا على كيفية استدعاء الإجراء. أيضا ، حاول استخدام fuslogvw.exe. قد يمنحك رسالة خطأ جميلة أيضًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top