سلام.
چند تا راه داره
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();
///////// الف //////////