كيف يمكنني استدعاء .NET DLL من البرنامج النصي لإعداد Inno؟
-
09-06-2019 - |
سؤال
أرغب في استدعاء وظيفة من ملف .NET DLL (المشفر بلغة C#) من برنامج Inno Setup النصي.
أملك:
- تم وضع علامة على قم بالتسجيل في إمكانية التشغيل المتداخل لـ COM الخيار في خصائص المشروع،
- غيرت comVisible الإعداد في معلومات التجميع.cs ملف،
- تمت إضافة هذه السطور إلى البرنامج النصي 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.
ما الخطأ الذي افعله؟
المحلول
عفوًا، يا سيء، لقد مر وقت طويل منذ أن قرأت باسكال!لذلك، إذا كنت تريد الحصول على القيمة، فهناك احتمالان:
- اكتب الوظيفة في C/C++ وقم بتصدير الوظيفة، وهذا بالتأكيد مدعوم.
- استخدم Managed C++ dll للدمج مع .NET dll الخاص بك، وكشف المكالمة كنقطة واجهة C (يجب أن يعمل هذا، ولكنه أصبح فوضويًا)
- استخدم ملف .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.
- تنفيذ طريقة ثابتة في مكتبة فئة C#
- أضف ال الصادرات غير المدارة حزمة NuGet لمشروعك
- تعيين هدف المنصة لمشروعك ل x86
- أضف ال
DllExport
تنسب إلى طريقتك - إذا لزم الأمر، قم بتعريف تنظيم لوسيطات الوظيفة (يجب تحديد تنظيم وسيطات السلسلة بشكل خاص).
- يبني
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';
البرنامج النصي Innosetup للكشف عن إطار عمل الدوت نت والإصدار القديم قد يكون من بعض الفائدة.