كيف يمكنني استدعاء .NET DLL من البرنامج النصي لإعداد Inno؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

أرغب في استدعاء وظيفة من ملف .NET DLL (المشفر بلغة C#) من برنامج Inno Setup النصي.

أملك:

  1. تم وضع علامة على قم بالتسجيل في إمكانية التشغيل المتداخل لـ COM الخيار في خصائص المشروع،
  2. غيرت comVisible الإعداد في معلومات التجميع.cs ملف،
  3. تمت إضافة هذه السطور إلى البرنامج النصي ISS:

[الملفات]

مصدر:c: emp\1\MyDLL.dll;الأعلام:dontcopy

[شفرة]

الدالة MyFunction():خيط؛

خارجي "MyFunction@files:MyDLL.dll stdcall setuponly"؛

لكن ما زلت أتلقى الخطأ التالي:

خطأ وقت التشغيل (عند -1:0):

لا يمكن استيراد dll:C:\DOCUME~1\foo\LOCALS~1 emp\is-LRL3E.tmp\MyDLL.dll.

ما الخطأ الذي افعله؟

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

المحلول

عفوًا، يا سيء، لقد مر وقت طويل منذ أن قرأت باسكال!لذلك، إذا كنت تريد الحصول على القيمة، فهناك احتمالان:

  1. اكتب الوظيفة في C/C++ وقم بتصدير الوظيفة، وهذا بالتأكيد مدعوم.
  2. استخدم Managed C++ dll للدمج مع .NET dll الخاص بك، وكشف المكالمة كنقطة واجهة C (يجب أن يعمل هذا، ولكنه أصبح فوضويًا)
  3. استخدم ملف .exe لتخزين نتيجة التعليمات البرمجية الخاصة بك في ملف .INI أو التسجيل أو في ملف مؤقت وقراءة النتيجة في قسم رمز الإعداد (هذا الآن سيئ بشكل صحيح)

عندما عملت آخر مرة مع InnoSetup، لم يكن يدعم السيناريو الخاص بك مباشرةً (استدعاء كود .NET من الإعداد).

نصائح أخرى

Intenta de esta manera (جرب بهذه الطريقة):

Var
 obj: Variant
 va: MyVariableType;
Begin
 //Starting
 ExtractTemporaryFile('MyDll.dll');
 RegisterServer(False, ExpandConstant('{tmp}\MyDll.dll'), False);
 obj := CreateOleObject('MyDll.MyClass');
 //Using
 va := obj.MyFunction();
 //Finishing
 UnregisterServer(False, ExpandConstant('{tmp}\MyDll.dll'), False);
 DeleteFile('{tmp}\MyDll.dll');
End;

سويرت (حظا سعيدا)

قرأت المزيد عنها - الآن أستطيع أن أرى الفرق بين استيراد دالة نمط C وإنشاء كائن OLE.

شيء من هذا القبيل من شأنه أن يعمل بالنسبة لي:

[Code]
procedure MyFunction();
var
  oleObject: Variant;
begin
  oleObject := CreateOleObject('MyDLL.MyDLL');

  MsgBox(oleObject.MyFunction, mbInformation, mb_Ok);
end;

ولكنه يتطلب تسجيل ملف DLL.

أعتقد أنه سيتعين علي إنشاء تطبيق سطر أوامر لاستدعاء الوظائف من ملف DLL.

أنت تحاول استيراد وظيفة نمط C من ملف .NET dll الخاص بك - وهذا ليس له أي علاقة بتشغيل COM المتداخل.يسمح لك إمكانية التشغيل المتداخل لـ COM بتنشيط كائنات .NET الخاصة بك ككائنات COM، ولا يعرضها كوظائف/أنواع مصدرة لـ C/C++.

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

أيضًا:انظر مجموعات الأخبار دعم innosetup حيث يمكنك الحصول على دعم أفضل.

استخدم ال مكتبة الصادرات غير المُدارة لتصدير دالة من مجموعة C#، بطريقة يمكن استدعاؤها في Inno Setup.

using RGiesecke.DllExport;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;

namespace MyNetDll
{
    public class MyFunctions
    {
        [DllExport(CallingConvention = CallingConvention.StdCall)]
        public static bool RegexMatch(
            [MarshalAs(UnmanagedType.LPWStr)]string pattern,
            [MarshalAs(UnmanagedType.LPWStr)]string input)
        {
            return Regex.Match(input, pattern).Success;
        }
    }
}

على جانب إعداد Inno:

[Files]
Source: "MyNetDll.dll"; Flags: dontcopy

[Code]
function RegexMatch(Pattern: string; Input: string): Boolean;
    external 'RegexMatch@files:MyNetDll.dll stdcall';

والآن يمكنك استخدام وظيفتك مثل هذا:

if RegexMatch('[0-9]+', '123456789') then
begin
  Log('Matched');
end
  else
begin
  Log('Not matched');
end;

أنظر أيضا:

من الأفضل استدعاء ملف .NET dll من أي لغة برمجة أخرى عن طريق تعريضه ككائن COM.الق نظرة على هذا المثال: http://support.microsoft.com/kb/828736.يوضح هذا كيفية استدعاء ".NET dll" من "C++ غير مُدار".يمكنك استبدال "Unmanged C++" بأي لغة برمجة أخرى يمكن استخدامها كعميل COM.

حاول استخدام Delayload، فهو يستخدم لملف dll الذي قد لا يكون موجودًا في وقت التشغيل.هذا حل المشكلة.

على سبيل المثال:

[Files]
Source: odbccp32.dll; Flags: dontcopy

[Code]
procedure SQLConfigDataSource(hwndParent: Integer; Frequest: Integer; LpszDriver: String; lpszAttributes: String);
external 'SQLConfigDataSource@files:odbccp32.dll stdcall delayload';
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top