نمایش نتایج 1 تا 12 از 12

نام تاپیک: صدا زدن evant button_click از exe ای دیگر

  1. #1
    کاربر دائمی آواتار sadaf_
    تاریخ عضویت
    مهر 1388
    محل زندگی
    اصفهان
    پست
    846

    صدا زدن evant button_click از exe ای دیگر

    سلام
    چطوری می شه در پروژه a یک evant از پروژه b را صدا زد؟
    ممنون

  2. #2
    کاربر دائمی
    تاریخ عضویت
    اسفند 1388
    پست
    381

    نقل قول: صدا زدن evant button_click از exe ای دیگر

    مثلا چه eventy رو میخوای صدا بزنی

  3. #3

    نقل قول: صدا زدن evant button_click از exe ای دیگر

    سلام.
    چند تا راه داره
    1. شیوه جواد بازی تو برنامه دوم میتونید ایونت مثلا دکمه رو به صورت Public تعریف کنید و فایل exe برنامه رو به عنوان رفرنس اضافه کنید به پروژه و بقیه ماجرا
    2. از Reflection استفاده کنید. خود این هم به دو صورت امکان پذیره
    الف. ایونتی رو که تو روش 1 Public کردید رو به حالت قبل برگردونید (Private) و بعد یک تابع Public برای صدا کردن این ایونت بنویسید و از برنامه 1 این تابع رو صدا بزنید. لازمش اینه که از dotnet 4 استفاده کنید به خاطر استفاده از نوع dynamic (روش نیمه جواد)
    ب. کلا Public کردن ها رو بزارید کنار و از متد Invoke برای صدا زدن تابع استفاه کنید. حالت الف و ب تا یه قسمت کداشون مشترکه.

    1.
                var frm = new Form2();
    frm.button1_Click(null, null); //button1_Click is public in Form2 in assembly WindowsFormsApplication2


    2. من مسیر مستقیم دادم. برای دسترسی به مسیر برنامه دوم هر جور که خودتون میخواید عمل کنید
                // load dll or exe from path
    var app2Path = Path.GetFullPath("..\\..\\..\\WindowsFormsApplicat ion2\\bin\\Debug\\WindowsFormsApplication2.exe");
    var asm = Assembly.LoadFile(app2Path);

    // find Form2 class in assembly WindowsFormsApplication2
    var frmInApp2 = asm.GetTypes().FirstOrDefault(t => String.Compare(t.Name, "Form2", StringComparison.OrdinalIgnoreCase) == 0);
    if (frmInApp2 == null) return;

    ///////// الف //////////
    dynamic frm = Activator.CreateInstance(frmInApp2);
    frm.PerformClick();
    ///////// الف //////////


    ///////// ب //////////
    // find button2_Click event in Form2 in assembly WindowsFormsApplication2
    var clickEvent = frmInApp2.GetMethod("button2_Click", BindingFlags.NonPublic | BindingFlags.Instance);
    // param1 is classInstance and param2 is method paramerers
    clickEvent.Invoke(Activator.CreateInstance(frmInAp p2), new object[] { null, null });
    ///////// ب //////////


    البته یه پست هم زدید با این عنوان
    اجرای پروژه های دیگر در یک پروژه
    که برای نمایش یکی از فرمهای پروژه 2 از داخل پروژه 1، از روش ب استفاه کنید. خطوط زیر یه مقدار تغییر میکنن
                // find Form2 class in assembly WindowsFormsApplication2
    var frmInApp2 = asm.GetTypes().FirstOrDefault(t => String.Compare(t.Name, "Form2", StringComparison.OrdinalIgnoreCase) == 0 &&
    t.BaseType == typeof(Form));
    if (frmInApp2 == null) return;

    ///////// الف //////////
    var frm = (Form)Activator.CreateInstance(frmInApp2);
    frm.Show();
    ///////// الف //////////
    آخرین ویرایش به وسیله Himalaya : یک شنبه 06 اسفند 1391 در 14:29 عصر

  4. #4
    کاربر دائمی آواتار sadaf_
    تاریخ عضویت
    مهر 1388
    محل زندگی
    اصفهان
    پست
    846

    نقل قول: صدا زدن evant button_click از exe ای دیگر

    نقل قول نوشته شده توسط karaji333 مشاهده تاپیک
    سلام.
    چند تا راه داره
    1. شیوه جواد بازی تو برنامه دوم میتونید ایونت مثلا دکمه رو به صورت Public تعریف کنید و فایل exe برنامه رو به عنوان رفرنس اضافه کنید به پروژه و بقیه ماجرا
    2. از Reflection استفاده کنید. خود این هم به دو صورت امکان پذیره
    الف. ایونتی رو که تو روش 1 Public کردید رو به حالت قبل برگردونید (Private) و بعد یک تابع Public برای صدا کردن این ایونت بنویسید و از برنامه 1 این تابع رو صدا بزنید. لازمش اینه که از dotnet 4 استفاده کنید به خاطر استفاده از نوع dynamic (روش نیمه جواد)
    ب. کلا Public کردن ها رو بزارید کنار و از متد Invoke برای صدا زدن تابع استفاه کنید. حالت الف و ب تا یه قسمت کداشون مشترکه.

    1.
     var frm = new Form2();
    frm.button1_Click(null, null); //button1_Click is public in Form2 in assembly WindowsFormsApplication2


    2. من مسیر مستقیم دادم. برای دسترسی به مسیر برنامه دوم هر جور که خودتون میخواید عمل کنید
     // load dll or exe from path
    var app2Path = Path.GetFullPath("..\\..\\..\\WindowsFormsApplicat ion2\\bin\\Debug\\WindowsFormsApplication2.exe");
    var asm = Assembly.LoadFile(app2Path);

    // find Form2 class in assembly WindowsFormsApplication2
    var frmInApp2 = asm.GetTypes().FirstOrDefault(t => String.Compare(t.Name, "Form2", StringComparison.OrdinalIgnoreCase) == 0);
    if (frmInApp2 == null) return;

    ///////// الف //////////
    dynamic frm = Activator.CreateInstance(frmInApp2);
    frm.PerformClick();
    ///////// الف //////////


    ///////// ب //////////
    // find button2_Click event in Form2 in assembly WindowsFormsApplication2
    var clickEvent = frmInApp2.GetMethod("button2_Click", BindingFlags.NonPublic | BindingFlags.Instance);
    // param1 is classInstance and param2 is method paramerers
    clickEvent.Invoke(Activator.CreateInstance(frmInAp p2), new object[] { null, null });
    ///////// ب //////////


    البته یه پست هم زدید با این عنوان
    که برای نمایش یکی از فرمهای پروژه 2 از داخل پروژه 1، از روش ب استفاه کنید. خطوط زیر یه مقدار تغییر میکنن
     // find Form2 class in assembly WindowsFormsApplication2
    var frmInApp2 = asm.GetTypes().FirstOrDefault(t => String.Compare(t.Name, "Form2", StringComparison.OrdinalIgnoreCase) == 0 &&
    t.BaseType == typeof(Form));
    if (frmInApp2 == null) return;

    ///////// الف //////////
    var frm = (Form)Activator.CreateInstance(frmInApp2);
    frm.Show();
    ///////// الف //////////
    دوست عزیز این روش درست کار می کنه اما یک مشکلی هست
    اینکه پروژه دوم باید اجرا بشه الببته کاربر نمی فهمه که اچرا شده و فرم مورد نظر را نمایش می دم
    چطوری اول پروژه را اجرا کنم و سپس همون رویداد را صدا بزنم؟

  5. #5
    کاربر دائمی آواتار sadaf_
    تاریخ عضویت
    مهر 1388
    محل زندگی
    اصفهان
    پست
    846

    نقل قول: صدا زدن evant button_click از exe ای دیگر

    دوستان لطفا راهنمایی کنید

  6. #6

    نقل قول: صدا زدن evant button_click از exe ای دیگر

    سلام.
    دوست عزیز این روش درست کار می کنه اما یک مشکلی هست
    اینکه پروژه دوم باید اجرا بشه الببته کاربر نمی فهمه که اچرا شده و فرم مورد نظر را نمایش می دم
    چطوری اول پروژه را اجرا کنم و سپس همون رویداد را صدا بزنم؟
    شما هر فرمی از پروژه دوم رو که بخواید، میتونید از طریق پروژه اول اجرا کنید. حتی بدون اجرای فرم میتونید توابعش رو فراخوانی کنید.
    کافیه نمونه سازی بشه از اون کلاس مورد نظر. حالا تو ادامه اگه کلاس مربوط به فرم بود، یا نمایشش میدید یا توابعش رو اجرا میکنید.
    متوجه نمیشم مشکلت کجاس

  7. #7
    کاربر دائمی آواتار sadaf_
    تاریخ عضویت
    مهر 1388
    محل زندگی
    اصفهان
    پست
    846

    نقل قول: صدا زدن evant button_click از exe ای دیگر

    من امنیت برنامه را در یک کلاس گذاشتم و همچنین ارتباط دیتابیس را هم در کلاسی دیگر
    حالا من نیاز دارم ابتدا کلاسها صدا زده بشه و سپس فرم مورد نظرم را لود کنم
    در این دستورات شما لود فرم درست کار می کنه اما من نفهمیدم چطوری کلاس را صدا بزنم؟
    و نکته دیگر اینکه فرمهای من در هنگام new پارامتر می گیرند یعنی باید یک یا چند مقدار پاس بدم در این روش چطوری مقدار پاس بدم؟
    ممنون

  8. #8

    نقل قول: صدا زدن evant button_click از exe ای دیگر

    سلام.
    ببین گفتم اصلا فقی نداره کلاس مربوط به فرم باشه یا نباشه. تنها چیزی که مهمه نمونه سازی از رو اون هستش. بعد از نمونه سازی هر بلایی خواستی میتونی سرش بیاری
    فرض کن کلاس زیر تو یه پروژه دیگه قرار داره و معادل همون کلاس امنیت شماس، که مشخص میکنه کاربر تو فرم x به دکمه y دسترسی داره یا نه. (کدای نوشته شده فقط واسه تست هستش)

    using System;
    using System.Collections.Generic;
    using System.Linq;

    namespace Security
    {
    public class ClsSecurity
    {
    private readonly string _btnName;
    private readonly string _frmName;
    public ClsSecurity(string frmName, string btnName)
    {
    _frmName = frmName;
    _btnName = btnName;
    }

    public bool AccessToButton()
    {
    return Access.GetTestAccessList().Any(c => String.Compare(c.FormName, _frmName, StringComparison.OrdinalIgnoreCase) == 0 &&
    String.Compare(c.ButtonName, _btnName, StringComparison.OrdinalIgnoreCase) == 0);
    }
    }

    public class Access
    {
    public string FormName { get; set; }
    public string ButtonName { get; set; }

    public static List<Access> GetTestAccessList()
    {
    return new List<Access>
    {
    new Access{FormName = "Form1", ButtonName = "Button1"},
    new Access{FormName = "Form1", ButtonName = "Button2"},
    new Access{FormName = "Form1", ButtonName = "Button3"},
    new Access{FormName = "Form1", ButtonName = "Button4"},
    new Access{FormName = "Form2", ButtonName = "Button1"},
    new Access{FormName = "Form2", ButtonName = "Button2"},
    };
    }
    }
    }


    و تو پروژه اصلی تو یه دکمه کدای زیر رو داریم

                var app2Path = Path.GetFullPath("..\\..\\..\\Security\\bin\\Debug  \\Security.dll");
    var asm = Assembly.LoadFile(app2Path);

    var clsSecurity = asm.GetTypes().FirstOrDefault(t => String.Compare(t.Name, "ClsSecurity", StringComparison.OrdinalIgnoreCase) == 0);
    if (clsSecurity == null) return;

    dynamic instance = Activator.CreateInstance(clsSecurity,new object[] { "Form1", "Button1" });
    MessageBox.Show(string.Format("Access To Button1 Is: {0}", instance.AccessToButton()));


    اولا که پارامتر دوم تابع CreateInstance میتونه یه آرایه از جنس Object باشه که داره ورودی های Constroctur مورد نظر رو مشخص میکنه (اگه چیزی نزاریم یعنی Constroctur پیش فرض)
    دوما اینجا من پروژه دوم رو به صورت ClassLibrary ایجاد کردم، پس تو Assembly.LoadFile مسیر dll رو قرار دادم نه exe (هیچ فرقی نداره. باز نگی واسه من exe هستش. یه کلاس خوب یه کلاسه دیگه، حالا فرقی نداره تو ClassLibrary تعریف شده باشه یا تو WinApp)
    اون چیزی هم که تو MessageBox نمایش داده میشه به ازای Button1 مقدار True و به ازای مثلا Button5 مقدار False هستش

  9. #9
    کاربر دائمی آواتار sadaf_
    تاریخ عضویت
    مهر 1388
    محل زندگی
    اصفهان
    پست
    846

    نقل قول: صدا زدن evant button_click از exe ای دیگر

    با تشکر از karaji333
    حالا من چطوری می تونم exe را اجرا کنم و بعد از اون به فرم هایی که می خوام دسترسی داشته باشم؟
    کاربر frmmain را مشاهده نمی کنه
    ممنونم

  10. #10

    نقل قول: صدا زدن evant button_click از exe ای دیگر

    سلام

    حالا من چطوری می تونم exe را اجرا کنم و بعد از اون به فرم هایی که می خوام دسترسی داشته باشم؟
    کاربر frmmain را مشاهده نمی کنه
    نمیدونم چرا اصلا به کدا دقت نمیکنی. به جای Form2 اسم فرمی رو که میخوای (از پروژه دوم) بزار و هر کاری خواستی باهاش انجام بده دیگه

    // find Form2 class in assembly WindowsFormsApplication2
    var frmInApp2 = asm.GetTypes().FirstOrDefault(t => String.Compare(t.Name, "Form2", StringComparison.OrdinalIgnoreCase) == 0 &&
    t.BaseType == typeof(Form));
    if (frmInApp2 == null) return;

    ///////// الف //////////
    var frm = (Form)Activator.CreateInstance(frmInApp2);
    frm.Show();
    ///////// الف //////////

  11. #11
    کاربر دائمی آواتار sadaf_
    تاریخ عضویت
    مهر 1388
    محل زندگی
    اصفهان
    پست
    846

    نقل قول: صدا زدن evant button_click از exe ای دیگر

    دقت کردم دوست عزیز فقط می خوام exe اجرا بشه نمی حوام اسم فرم را بدم

  12. #12

    نقل قول: صدا زدن evant button_click از exe ای دیگر

    فقط می خوام exe اجرا بشه نمی حوام اسم فرم را بدم
    Process.Start("exe path");

تاپیک های مشابه

  1. صدا زدن فرم برنامه از درون برنامه اجرای دیگر
    نوشته شده توسط سعید صابری در بخش VB.NET
    پاسخ: 1
    آخرین پست: شنبه 19 فروردین 1391, 17:06 عصر
  2. صدا زدن dll از کلاس دیگر
    نوشته شده توسط mehrpars در بخش مباحث عمومی دلفی و پاسکال
    پاسخ: 6
    آخرین پست: چهارشنبه 29 اردیبهشت 1389, 01:15 صبح
  3. سوال: صدا زدن یک کلاس در کلاس دیگر
    نوشته شده توسط ramin149 در بخش ASP.NET Web Forms
    پاسخ: 1
    آخرین پست: دوشنبه 27 اردیبهشت 1389, 14:28 عصر
  4. صدا زدن یک متد داخل رویداد کلیک شیئ دیگر
    نوشته شده توسط elahe1364 در بخش C#‎‎
    پاسخ: 5
    آخرین پست: یک شنبه 13 بهمن 1387, 10:43 صبح
  5. صدا زدن یک متد از یک صفحه دیگر !
    نوشته شده توسط shahramasp در بخش ASP.NET Web Forms
    پاسخ: 5
    آخرین پست: یک شنبه 03 تیر 1386, 11:02 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •