گفتگو هایی در باب سی شارپ

the_king

مدیرکل انجمن
سلامی مجدد
خیلی ممنون استاد.
قبلا درباره ی پروژه های چند لایه ازتون سئوال پرسیده بودم ، شما گفتین هر جور دوست دارم ، عمل کنم .
اما من میخوام اصولی کار کنم .
الان استاد ، من برای پروژه ام (پشتیبانگیر طلوع) ، 2 کلاس میسازم . یکی بنام VssBackup (که کارها و متدهای مربوط به بکاپ گیری را توش مینویسم) و یکی هم Database (که کارها و متدهای مربوط به دیتابیس را توش مینویسم) . متدهای مربوط به رابط کاربری را توی همون فرمی که دارم (مثلا توی صفحه ی تنظیمات ، توی فرم تنظیمات و توی صفحه ی اصلی پروژه ، توی فرم پروژه ی اصلی ام مینویسم) .
میخوام بدونم :
اولا نیاز هست که برای رابط کاربری (که بصورت پیش فرض میخوام کدها را توی همون فرم بنویسم) ، کلاس مجزای دیگه ای بنویسم؟ مثلا شما همون متدهای LoadSetting و این جور چیزهایی که قبلا (توی توی قضیه ی لود و آپدیت و ذخیره و خوندن تنظیمات از دیتابیس برای فرم تنظیمات میگفتین) را توی کلاس مجزایی مینویسین یا توی فرم تنظیمات تون مینویسین؟
دوما که من الان دو تا کلاس که دارم (کلاس های VssBackup و Database ) ، توی کلاس فرم ام که میخوام با این کلاس ها ارتباط برقرار کنم ، بهتره با هر کدوم شون در فرم ام ارتباط داشته باشم (روش اول . یعنی در کلاسِ فرم ام ، از هر دوی این کلاس ها شی ایجاد کنم و بصورت مجزا ، با هر کدوم شون در ارتباط باشم) یا اینکه بهتره که در کلاس فرم ام فقط با کلاس میانی (یعنی کلاس VssBackup ) رابطه داشته باشم و از داخل کلاس VssBackup ، با کلاس Database ارتباط برقرار کنم (روش دوم) ؟
یعنی بهتره بصورت مستقیم ، در کلاس فرم ام ، با کلاس Database ام رابطه داشته باشم (روش اول که در بالا گفتم) یا بصورت غیر مستقیم (روش دوم)؟
من حس میکنم بصورت مستقیم رابطه داشته باشم ، بهتره . درسته؟
کلا درباره ی این قضیه یه کم راهنمایی میکنین که روابط کلاس ها ، چجوری باشن (و اینکه چند تا کلاس اصلی برای کارهام داشته باشم) بهتره؟
خیلی ممنون
در خیلی از موارد نه بهتری وجود داره و نه اصول خاصی، صرفا سلیقه و دید شما است، نسبت به یک موضوعی که ممکنه با بقیه فرق کنه. از اول عادت کنید که روی هیچ قاعده ای وسواس بی مورد بخرج ندید.
بعضی ها خوششون میاد هر چیز کوچکی رو بصورت کلاس در بیارن، بعضی ها هم کلا از کلاس سازی فراری اند. سلیقه و دید شون فرق داره. ولی افراط و تفریط و وسواس روی رعایت موارد جزئی و کم اهمیت فقط وقت تون رو تلف میکنه. از طرف دیگه حجم پروژه و زمانی که باید صرفش بشه در نظر بگیرید، ابدا ارزش نداره که برای پروژه های کوچک روی رعایت معماری هایی تمرکز بشه که منفعتشون رو در پروژه های خیلی بزرگ نشون میدن. مثل اینه که بخواهیم یک ربع وقت صرف خوردن صبحونه بکنیم و بریم سر کار، اما برای چیدن اون میز صبحونه بیخودی پنج ساعت وقت صرف کنیم.

فرض کنیم که تنظیمات شامل موارد x و y و z باشه. اگر قراره تمامی این تنظیمات صرفا در فرم فلان مورد استفاده قرار بگیره و ربطی به سایر کلاس ها و فرم ها نداره، لزومی نداره که برایش کلاس مجزایی در نظر بگیرید و در همون کلاس فرم فلان میتونه پیاده سازی بشه. می توانید برایش کلاس مجزا بسازید ولی منفعتی حاصل نمیشه. ولی وقتی قراره تنظیمات در چندین فرم مورد استفاده قرار بگیرند، بهتره که یک کلاس مخصوص تنظیمات داشته باشید و LoadSetting هم داخل همون کلاس باشه. از هر جایی هم که لازم باشه به این کلاس رجوع میکنید، حالا حتی اگر مناسب بود کلاس static که نیازی به شی سازی هم نباشه.
برای پروژه ای در سطح کار شما هیچ فرقی نمی کنه که شما مستقیم با یک کلاسی در ارتباط باشید یا نباشید، چون شما با هیچ معماری خاصی عهد و پیمان نبستید و با رعایت نیم بند هیچ معماری خاصی هم اتفاق بدی نمی افته. شما باید روشی رو بکار ببرید که با حداقل زحمت و کمترین زمان بهترین نتیجه رو بگیرید. نه کسی بابت رعایت صد در صدی معماری فلان بهتون جایزه میده و نه کاربر میفهمه که پشت پرده شما چه کردید.
اینجا نه بهتری وجود داره و نه بدتری. اگر کسی اصرار داشته باشه که حتما معماری فلان، فرضا MVC رو بدون کوچکترین گذشت و خیلی دقیق در همه پروژه هاش بکار ببره، من تنها با این دید به قضیه نگاه می کنم که طرف وسواس داره، همچین برنامه نویسی درکی از مزایا و معایب ها مدل ها نداره، گرفتار وسواس خودش شده. نه این کارش خیلی خوبه و نه از سختگیری اش مزیتی بدست میاره.

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
اولا یادتون نگهدارید که هیچ Attribute ای خودش هیچ کدی رو در مورد فلان چیزی که بهش نسبت میدید اجرا نمی کنه، صفت فقط یک نشانه است برای متد هایی که نسبت به وجود اون صفت حساس هستند.
این متد های دیگری هستند که ممکنه طوری کد نویسی بشن که بررسی کنند که آیا در مورد فلان آیتم Attribute خاصی بکار برده شده یا نه و اگر بکار برده شده پس حالا بیا فلان کار رو انجام بده.
پس اینکه بگیم STAThreadAttribute یا هر صفت دیگری فلان کار رو انجام داد اشتباهه. STAThreadAttribute موجب میشه که فلان کار صورت بگیره، خودش کاری انجام نمیده.

منظور اون راهنمایی اینه که شما فایل اجرایی برنامه تون یک ++C از نوع Unmanaged باشه که داخلش CoInitializeSecurity رو خودتون فراخوانی کنید و #C تون رو بصورت یک dll برایش بکار ببرید، یعنی برنامه اصلی تون رو به زبان #C نخواهید نوشت. برای ارتباط بین ++C و #C باید متد های dll تون که به زبان #C ئه رو باید بصورت متد های COM (مثل ActiveX) ها تعریف بشه که ++C بتونه بصورت یک کتابخانه ActiveX بهش دسترسی داشته باشه، چون ++C نمیتونه با کتابخانه ای که برای NET. نوشته شده ارتباط برقرار کنه :
ComVisibleAttribute Class


خطا مربوط به کد کامپایل شده اسمبلی دیگری نیست، در کد پروژه خودتونه، جای دیگری نگردید. راهی که بتوانید محل پیدایش اش رو پیداش کنید همون استفاده از try catch در کدهاتونه.

استاد ، طبق توضیحات تون و اینکه من اتوپلی مدیا استودیو را هم بلد هستم که از زبان لوا که زبانی unmanaged هست ، استفاده میکنه و همچنین با توجه به پلاگینِ MemoryEx اش (که باهاش آشنایید و قابلیت کار با توابع unmanaged را داره) ، برای اینکه بتونم از تابع CoInitialize استفاده کنم (برای تامین امنیت بکاپ هایی که گرفتم) ، اگه نرم افزار بکاپ گیری را توی اتوپلی بنویسم اما یه dll از سی شارپ برای عملیات بکاپ گیری (مثل بکاپ گرفتن و هر کار دیگه ای که به بکاپ مربوط میشه) بنویسم و این dll را توی اتوپلی فراخونی کنم ، به هدفم (که تامین امنیت با فراخونی از متد CoInitialize توسط پلاگین MemoryEx در اتوپلی هست) ، میرسم؟ و بنابراین ، بهتر نیست که نرم افزار اصلی مو توی اتوپلی طراحی کنم و بنویسم و از سی شارپ فقط dll درست کنم و در اتوپلی استفاده کنم؟
 

the_king

مدیرکل انجمن
استاد ، طبق توضیحات تون و اینکه من اتوپلی مدیا استودیو را هم بلد هستم که از زبان لوا که زبانی unmanaged هست ، استفاده میکنه و همچنین با توجه به پلاگینِ MemoryEx اش (که باهاش آشنایید و قابلیت کار با توابع unmanaged را داره) ، برای اینکه بتونم از تابع CoInitialize استفاده کنم (برای تامین امنیت بکاپ هایی که گرفتم) ، اگه نرم افزار بکاپ گیری را توی اتوپلی بنویسم اما یه dll از سی شارپ برای عملیات بکاپ گیری (مثل بکاپ گرفتن و هر کار دیگه ای که به بکاپ مربوط میشه) بنویسم و این dll را توی اتوپلی فراخونی کنم ، به هدفم (که تامین امنیت با فراخونی از متد CoInitialize توسط پلاگین MemoryEx در اتوپلی هست) ، میرسم؟ و بنابراین ، بهتر نیست که نرم افزار اصلی مو توی اتوپلی طراحی کنم و بنویسم و از سی شارپ فقط dll درست کنم و در اتوپلی استفاده کنم؟
اول باید ببینید اتوپلی موقع فراخوانی CoInitialize خطا میده یا نه، چون ممکنه اونم داخلش همچین فراخوانی رو قبلا انجام داده باشه و نتوانید ازش استفاده کنید.
ثانیا باید ببینید آیا ساختن کتابخانه ای در #C میسازید میتونه در اتوپلی به اندازه کافی مفید باشه یا نه. تضمینی وجود نداره که نتیجه موفقیت آمیز باشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
اول باید ببینید اتوپلی موقع فراخوانی CoInitialize خطا میده یا نه، چون ممکنه اونم داخلش همچین فراخوانی رو قبلا انجام داده باشه و نتوانید ازش استفاده کنید.

خیلی ممنون
الان از لحاظ اینکه بکاپ ها در dll در دات نت گرفته میشه اما بقیه ی اجزا در اتوپلی هستن، متد CoInitializeSecurity از این لحاظ مشکلی برای تامین امنیت بکاپ نخواهد داشت؟ همه شون جزء یه پروسس حساب میشن و متد CoInitializeSecurity هم پروسس را فقط میشناسه دیگه . درسته؟

ثانیا باید ببینید آیا ساختن کتابخانه ای در #C میسازید میتونه در اتوپلی به اندازه کافی مفید باشه یا نه. تضمینی وجود نداره که نتیجه موفقیت آمیز باشه.

چرا؟
مثلا چه اشکالی ممکنه پیش بیاد؟
از اتوپلی ، یه متدی که توی سی شارپ در dll ساختیم را فراخونی میکنیم و بقیه ی موارد در سی شارپ انجام میشه .
 

the_king

مدیرکل انجمن
خیلی ممنون
الان از لحاظ اینکه بکاپ ها در dll در دات نت گرفته میشه اما بقیه ی اجزا در اتوپلی هستن، متد CoInitializeSecurity از این لحاظ مشکلی برای تامین امنیت بکاپ نخواهد داشت؟ همه شون جزء یه پروسس حساب میشن و متد CoInitializeSecurity هم پروسس را فقط میشناسه دیگه . درسته؟
اگه در DLL خودتون مستیقما یا در روتین های داخل DLL با دستوری غیر مستقیم پروسه جدید نسازید اون CoInitializeSecurity برای فراخوانی های داخل DLL ها هم تاثیر میذاره.

چرا؟
مثلا چه اشکالی ممکنه پیش بیاد؟
از اتوپلی ، یه متدی که توی سی شارپ در dll ساختیم را فراخونی میکنیم و بقیه ی موارد در سی شارپ انجام میشه .
مستنداتی وجود نداره که مشخص کرده باشه موقع فراخوانی کردن کتابخانه Managed هیچگونه CoInitializeSecurity ای اجرا نخواهد شد یا فراخوانی غیرمستقیم VSS توسط کتابخانه آماده ای در داخل کد #C ای که خودش کتابخانه میشه الزاما از اون CoInitializeSecurity پیروی کنه. دارید به یک فرضیه فکر می کنید که اثبات نشده در عمل درست باشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
اگه در DLL خودتون مستیقما یا در روتین های داخل DLL با دستوری غیر مستقیم پروسه جدید نسازید اون CoInitializeSecurity برای فراخوانی های داخل DLL ها هم تاثیر میذاره.


مستنداتی وجود نداره که مشخص کرده باشه موقع فراخوانی کردن کتابخانه Managed هیچگونه CoInitializeSecurity ای اجرا نخواهد شد یا فراخوانی غیرمستقیم VSS توسط کتابخانه آماده ای در داخل کد #C ای که خودش کتابخانه میشه الزاما از اون CoInitializeSecurity پیروی کنه. دارید به یک فرضیه فکر می کنید که اثبات نشده در عمل درست باشه.

خیلی ممنون استاد
سئوالی که اینجا پیش میاد اینه که متد CoInitialize ، داخل clr فراخونی شد.
وقتی متدهایی که در dll ام در سی شارپ را که نوشتم ، از اتوپلی فراخونی کنم ، قطعا clr اول باید اجرا بشه دیگه . بنابراین متد CoInitialize ای که در اتوپلی فراخونی کرده بودم را نادیده نمیگیره؟
متوجه ی سئوالم شدین؟
 

the_king

مدیرکل انجمن
خیلی ممنون استاد
سئوالی که اینجا پیش میاد اینه که متد CoInitialize ، داخل clr فراخونی شد.
وقتی متدهایی که در dll ام در سی شارپ را که نوشتم ، از اتوپلی فراخونی کنم ، قطعا clr اول باید اجرا بشه دیگه . بنابراین متد CoInitialize ای که در اتوپلی فراخونی کرده بودم را نادیده نمیگیره؟
متوجه ی سئوالم شدین؟
سوالتون رو شاید درست مطرح نکرده باشید چون اجرای ماشین مجازی اینجا مطرح نیست.
اگر اتوپلی خودش CoInitialize رو فراخوانی نکرده باشه و شما در اتوپلی فراخوانیش کنید، دیگه اینکه بعدا در dll مجددا CoInitialize فراخوانی بشه یا نشه مهم نیست، چون دفعه اول فراخوانی CoInitialize تاثیر داره، مهم اینه که نفر اول باشید. اینکه بعد از شما جای دیگری مجددا فراخوانی بشه یا نشه تاثیر و اهمیتی برای برنامه و پروسه شما نخواهد داشت.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام استاد علی
چرا با این لحن صحبت میکنین؟ یه کم بخندین :green: آدم میترسه سئوال بپرسه.
خوب من جستجو میکنم و گاها جواب نمیگیرم ، گاها هم به قول تون سطحی میخونم ولی اون مقالاتی که فکر میکنم به کارم بیشتر میاد را تا آخر میخونم حالا ممکنه بخاطر اینکه بعضی از مسائل اش را ندونم ، متوجه نشم . بعضی ها دا که اصلا نتیجه ی خاصی پیدا نمیکنم. در این صورت ، لینک هایی که شما میدین را معمولا تا آخر میخونم. کلا منظورم اینه که این طور نیست که اغلب مطالب را سرسرکی بخونم .

_____________________

یه مطلبی در این باره پیدا کردم ببینید :

pinvoke.net: CoInitializeSecurity (ole32)

اگه اشتباه متوجه نشده باشم ، میگه اتریباتس staThreading بصورت ضمنی و مخفیانه ، داخل خودش ، متد CoInitialize را فراخونی میکنه که اون هم متد CoInitializeSecurity را فراخونی میکنه . از اونجایی که این متد فقط یه بار باید فراخونی بشه وگرنه ارور RPC_E_TOO_LATE رو میده ، پس این اتریباتس staThreading را باید از متد main حذف کرد .
در پاراگراف دوم هر چند میگه باید براش توی زبان های unmanaged یه تابع و اینا درست کرد و در زبان های unmanaged فراخونی شون کرد ولی خوب قطعا میشه توی سی شارپ هم توسط DllImport بصورت مستقیم فراخونی کرد که توی کد هم همین رو آورد .
بعد هم میگه گزینه ی Visual Studio Hosting Process که بصورت پیش فرض فعال هست ، باعث میشه همین متد CoInitializeSecurity فراخونی بشه که باید این گزینه را غیر فعال کنید .

حالا اینهایی که متوجه شدم ، درسته و کلا مقاله اش به این موضوع ربط داره دیگه؟ اگه ربط نداره ، لطف میکنین لینک ها و مقالاتی بدین تا بخونم؟

بعد اینکه entery point method به متد main میگن؟ حالا جایی که تنها میگن entry point ، به چی میگن؟

استاد ، نسخه ی 2015 ویژال استودیو رو نصب کنم و ببینم توی قسمت debug ، گزینه ی "Visual Studio Hosting Process" داره که غیر فعال اش کنم . توی نسخه های 2017 و 2019 که نیست .
چون انگار همونطور که قبلا هم این پست بالا مو تایید کردین ، اگه گزینه ی "Visual Studio Hosting Process" رو غیر فعال کنیم ، متد CoInitializeSecurity را در clr فراخونی نمیکنه .
طبق توضیح همون لینک :

pinvoke.net: CoInitializeSecurity (ole32)

کوچ به نسخه ی 2015 ویژال استودیو ، خیلی خیلی بهتر از اتوپلی هست .
 

the_king

مدیرکل انجمن
استاد ، نسخه ی 2015 ویژال استودیو رو نصب کنم و ببینم توی قسمت debug ، گزینه ی "Visual Studio Hosting Process" داره که غیر فعال اش کنم . توی نسخه های 2017 و 2019 که نیست .
چون انگار همونطور که قبلا هم این پست بالا مو تایید کردین ، اگه گزینه ی "Visual Studio Hosting Process" رو غیر فعال کنیم ، متد CoInitializeSecurity را در clr فراخونی نمیکنه .
طبق توضیح همون لینک :

pinvoke.net: CoInitializeSecurity (ole32)

کوچ به نسخه ی 2015 ویژال استودیو ، خیلی خیلی بهتر از اتوپلی هست .
اون Visual Studio Hosting Process مربوط به Debug کردن داخل ویژوال استدیو ئه، ربطی به فایل اجرایی که میسازید و مستقل اجرا می کنید نداره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
اون Visual Studio Hosting Process مربوط به Debug کردن داخل ویژوال استدیو ئه، ربطی به فایل اجرایی که میسازید و مستقل اجرا می کنید نداره.

خیلی ممنون استاد .
پس اون لینک چی میگه اگه این گزینه را غیر فعال کنیم ، میتونیم اپلیکیشن مون را دیباگ کنیم تا متد CoInitializeSecurity را بتونیم فراخونی کنیم.
 

the_king

مدیرکل انجمن
خیلی ممنون استاد .
پس اون لینک چی میگه اگه این گزینه را غیر فعال کنیم ، میتونیم اپلیکیشن مون را دیباگ کنیم تا متد CoInitializeSecurity را بتونیم فراخونی کنیم.
خوبه که بالاش bold نوشته که نباید از داخل محیط managed فراخوانی اش کنید. لینک چیزی نمیگ، یک کاربر نظر خودش رو نوشته.
یک پیج آزاد ئه، مثل ویکی پدیا، ممکنه هر کاربری بیاد نظر خودش رو بنویسه. قرار نیست که هر کی هر چی هر جا نوشته درست باشه که.
وقتی برنامه اجرایی مجزا چه dll و چه exe ساختید و اجراش می کنید که ویژوال استدیو نه در حال اجرا است و نه Debug ای در کار ئه. من روی یه سیستم Visual Studio 2015 دارم، فایلی که برای پروژه Build می کنم چه با گزینه فعال و چه غیر فعال مشابه ئه، گزینه داخل ویژوال استدیو روی شیوه debug خود ویژوال استدیو تاثیر میذاره نه فایل اجرایی که مستقل اجرا می کنیم.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
من که نمیدونم الان کاربر فعلی تون از چه نوعیه، یک کاربر غیر ادمین باشه، از گروه کاربران standard باشه :
How to change a Windows 10 user account type and why


خبر خوبی نیست، یعنی شما هر کاری با پروسه تون بکنید تاثیری روی روال alphavss نداره. دسترسی پروسه تون نقشی در ماجرا نداره که بخواهید روی اون وقت بذارید.

سلام استاد
استاد ، این مربوط به پست 1025 (صفحه ی 52) هست.
الان در این پست و پست 1026 ، این نتیجه گرفته شد که alphavss یا vss ، پروسه ی مجزایی دارن و بنابراین استفاده از متد CoInitializeSecurity ، تاثیری در روند کار نداره؟
البته پاراگراف اول در پست 1026 ام رو که به ادامه ی این تست مربوط میشد را جواب ندادید .
الان پس جواب قطعی ، همونی هه که گفتید پروسه ی مجزایی دارن و بنابراین استفاده از متد CoInitializeSecurity ، تاثیری در روند کار نداره؟
اگه این طوره ، پس استفاده از این متد در اتوپلی هم تاثیری نداره دیگه؟ درسته؟

با Alphavss که ارتباط COM ندارید. با VSS هم که ارتباط مستقیمی ندارید. همچین جایی در کدتون نیست که ارتباط COM برقرار باشه.

سلامی مجدد
خیلی ممنون استاد
استاد ، این رو در پست 983 گفته بودین (صفحه ی 50)
اینکه پروسه ی مون ارتباط com با کمپوننت ای داشته باشه ، یعنی چی و از کجا متوجه میشن ارتباط شون بصورت com هست یا نه؟
منظورتون فراخونی اعضا و متدهای unmanaged هست (که آیا بصورت مستتقیم انجام میشه یا نه) ؟ اگه منظورتون این نیست ، چجوری میشه بین پروسه ی سی شارپ مون با کمپوننت ای ، رابطه ی com برقرار کرد؟

ثانیا COM صرفا یک مدل ارتباطیه، بین انواع مدلهای ارتباطی موجود. و مفهوم متد ربطی به مدل ارتباطی COM نداره.
COM بوجود اومده تا زبان های برنامه نویسی متفاوت زمان خودش بتوانند با یک استاندارد یکسان و مشخص با هم تعامل داشته باشند، ربطی به این نداره که خود یک زبان شیء گرا بوده یا نه.

این رو در پست 991 گفته بودین .
منظور از مدل ارتباطی ، چیه؟
چند نوع مدل ارتباطی داریم؟
 

the_king

مدیرکل انجمن
سلام استاد
استاد ، این مربوط به پست 1025 (صفحه ی 52) هست.
الان در این پست و پست 1026 ، این نتیجه گرفته شد که alphavss یا vss ، پروسه ی مجزایی دارن و بنابراین استفاده از متد CoInitializeSecurity ، تاثیری در روند کار نداره؟
بر اساس آزمایشی که کردید نه، نداره.

البته پاراگراف اول در پست 1026 ام رو که به ادامه ی این تست مربوط میشد را جواب ندادید .
چیزی برای جواب دادن وجود نداشت. نتیجه میگیرید که برنامه تون باید خودش دسترسی admin داشته باشه و alphavss با سطح دسترسی برنامه شما کار میکنه.

الان پس جواب قطعی ، همونی هه که گفتید پروسه ی مجزایی دارن و بنابراین استفاده از متد CoInitializeSecurity ، تاثیری در روند کار نداره؟
اگه این طوره ، پس استفاده از این متد در اتوپلی هم تاثیری نداره دیگه؟ درسته؟
بله، از آزمایش شما میشه اینطور نتیجه گرفت. CoInitializeSecurity فقط روی ارتباط COM تاثیر میذاره و چون اون آزمایش نشون داد ارتباط COM ای بین برنامه شما و alphavss و vss نیست، استفاده از CoInitializeSecurity تاثیری نخواهد داشت، چه بصورت dll و چه بصورت exe

سلامی مجدد
خیلی ممنون استاد
استاد ، این رو در پست 983 گفته بودین (صفحه ی 50)
اینکه پروسه ی مون ارتباط com با کمپوننت ای داشته باشه ، یعنی چی و از کجا متوجه میشن ارتباط شون بصورت com هست یا نه؟
من با فلانی ارتباط تلفنی داشته باشم یعنی چی؟ یعنی از طریق تلفن با فلانی حرف میزنم دیگه. یعنی با کمپوننت ای ارتباط برقرار کنه که سیستم ارتباطی اش COM باشه. دیدید وقتی میخواهید به پروژه تون Reference اضافه کنید یک زبانه COM هست؟ هر چی از اون زبانه انتخاب کنید از ارتباط COM استفاده خواهد کرد.

منظورتون فراخونی اعضا و متدهای unmanaged هست (که آیا بصورت مستتقیم انجام میشه یا نه) ؟ اگه منظورتون این نیست ، چجوری میشه بین پروسه ی سی شارپ مون با کمپوننت ای ، رابطه ی com برقرار کرد؟
هر چی که خارج از محیط managed باشه unmanaged ئه، ولی قرار نیست هر ارتباطی با محیط unmanaged داریم از طریق COM باشه. کمپوننت اگر طراحی کمپوننت بر اساس ActiveX / COM باشه بهش Reference می دهید و ازش استفاده می کنید، لازم نیست کار خاصی انجام بدید، NET. ارتباط COM رو پشتیبانی می کنه و اجزاء داخل کمپوننت رو نشون میده.

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

چند نوع مدل ارتباطی داریم؟
خیلی زیاد، نمیدونم. هر شرکتی هم ممکنه خودش مدل ارتباطی اختراع کنه. OLE, CDO, DDE, XPCOM, CIAO و ...
مثلا مایکروسافت اینجوری شروع کرده :
ole.jpg
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بر اساس آزمایشی که کردید نه، نداره.

چیزی برای جواب دادن وجود نداشت. نتیجه میگیرید که برنامه تون باید خودش دسترسی admin داشته باشه و alphavss با سطح دسترسی برنامه شما کار میکنه.

بله، از آزمایش شما میشه اینطور نتیجه گرفت. CoInitializeSecurity فقط روی ارتباط COM تاثیر میذاره و چون اون آزمایش نشون داد ارتباط COM ای بین برنامه شما و alphavss و vss نیست، استفاده از CoInitializeSecurity تاثیری نخواهد داشت، چه بصورت dll و چه بصورت exe

خیلی ممنون استاد
با راهنمایی های شما ، آزمایش را انجام داده بودم.

من با فلانی ارتباط تلفنی داشته باشم یعنی چی؟ یعنی از طریق تلفن با فلانی حرف میزنم دیگه. یعنی با کمپوننت ای ارتباط برقرار کنه که سیستم ارتباطی اش COM باشه. دیدید وقتی میخواهید به پروژه تون Reference اضافه کنید یک زبانه COM هست؟ هر چی از اون زبانه انتخاب کنید از ارتباط COM استفاده خواهد کرد.


هر چی که خارج از محیط managed باشه unmanaged ئه، ولی قرار نیست هر ارتباطی با محیط unmanaged داریم از طریق COM باشه. کمپوننت اگر طراحی کمپوننت بر اساس ActiveX / COM باشه بهش Reference می دهید و ازش استفاده می کنید، لازم نیست کار خاصی انجام بدید، NET. ارتباط COM رو پشتیبانی می کنه و اجزاء داخل کمپوننت رو نشون میده.

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


خیلی زیاد، نمیدونم. هر شرکتی هم ممکنه خودش مدل ارتباطی اختراع کنه. OLE, CDO, DDE, XPCOM, CIAO و ...
مثلا مایکروسافت اینجوری شروع کرده :
مشاهده پیوست 112959


آها .
پس ، مدل ، به نوعی میشه گفت ، کار پروتکل در اینترنت را انجام میده . یعنی یه قاعده و قانون برای ارتباط ، تعریف میکنه .
هر چند ، من جزئیات com را نمیدونم . تفاوت اش با مدل های دیگه را هم نمیدونم . حالا چرا com و activex (که فکر کنم activex ، زیر مجموعه ی com باشه) توی این مدل ها فقط روی بورس اومدن؟ بقیه ی مدل ها رو من اصلا نشنیدم .

-----------------------------------

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

دوم اینکه اگه موقع حذف فایلی ، یکی از این عملیات (چون نمیدونم چه عملیاتی هست ، عملیات نوشتن روی فایل را در نظر میگیرم از این به بعد) انجام میشه ، آیا رویدادی هست تا قبل از به وقوع پیوستنِ اون عملیات (عملیات نوشتن) بر روی اون فایل ، بشه متوجه شد که چه پروسه ای در خواستِ اون عملیات (عملیات نوشتن) رو کرد؟ و مهمتر اینکه اگه رویدادی هست که بهمون این خبر رو بده ، تا کد مون اجرا نشد ، اون عملیات (عملیات نوشتن) ، روی اون فایل ، اجرا نشه . همچین چیزی قابل اجراست؟
میخوام اگه بشه ، برای محافظت از فایل های بکاپ ، اگه پروسه ی دیگه ای درخواست عملیاتی که به حذف فایل میتونه منجر بشه (که نمیدونم عملیات نوشتن روی فایل هست یا چه چیز دیگه ای) رو داد ، قبل اش رویداد من اجرا بشه و بتونم توی اون رویداد ، اون پروسه ی درخواست کننده را پیدا کنم که اگه پروسه ی برنامه ای اجرا شده (در تسک منیجر) بود و کلا روند و پروسه ی رسمی vss نبود ، همه ی مجوز دسترسی به اون فایل بکاپ را برای همین user جاری ویندوز ، مسدود کنه . بعد دوباره این مجوز را فعال کنم تا سرویس vss بتونه کارهاش رو روش انجام بده (که قبلا کارهای سرویس vss را توضیح داده بودین) .

این کار شدنی هست؟
 
سلام وقت بخیر:
عذر میخوام من هاست دارم cpanel,phpadmin ssl ..داره ولی سرور ندارم.میخوام ببینم میشه برای سوکت نویسی از هاست استفاده کرد به جای سرور؟یا هر ترفند دیگه که مارو از خرید سرور بی نیاز کنه.زبان برنامه نویسی هم اندروید جاوا یا سی شارپ باشه
 

the_king

مدیرکل انجمن
یه چیز اینکه استاد ، انگار همون روشی که قبلا درباره ی محافظت از بکاپ که گفته بودید (اینکه باید از توابع و کلاس vss ببینم که راهی برای محافظت از فایل های بکاپ داره یا نه) ، انگار جواب میده .
اما میخوام بدونم اولا وقتی فایلی ، حذف میشه ، در واقع عمل خوندن یا نوشتن (یا هر دو) روی اون فایل انجام میشه (اگه فقط همین دو تا عملیات هست ، هر دوی شون هستن یا یکی از این عملیات هست؟) یا عملیات دیگه ای هم هست؟ اگه هست ، چه نوع عملیاتی هست؟
از دید سیستم فایل حذف شدن یک عملیات مجزا است و روتین خاص خودش رو داره. کاری که بعضی نرم افزار ها برای حذف غیر قابل بازگشت انجام میدن یک مرحله اولیه داره که بازنویسی محتویات فایل ئه و در روال عادی حذف فایل ها همچین مرحله ای نیست.

دوم اینکه اگه موقع حذف فایلی ، یکی از این عملیات (چون نمیدونم چه عملیاتی هست ، عملیات نوشتن روی فایل را در نظر میگیرم از این به بعد) انجام میشه ، آیا رویدادی هست تا قبل از به وقوع پیوستنِ اون عملیات (عملیات نوشتن) بر روی اون فایل ، بشه متوجه شد که چه پروسه ای در خواستِ اون عملیات (عملیات نوشتن) رو کرد؟ و مهمتر اینکه اگه رویدادی هست که بهمون این خبر رو بده ، تا کد مون اجرا نشد ، اون عملیات (عملیات نوشتن) ، روی اون فایل ، اجرا نشه . همچین چیزی قابل اجراست؟
شما نمی توانید رخدادی که در لایه سیستمی بوجود میاد رو معطل پاسخ نرم افزار خودتون کنید. فقط می توانید در حد محدودی مطلع بشید که چی رخ داده، نه اینکه چی قراره رخ بده :
FileSystemWatcher Class

میخوام اگه بشه ، برای محافظت از فایل های بکاپ ، اگه پروسه ی دیگه ای درخواست عملیاتی که به حذف فایل میتونه منجر بشه (که نمیدونم عملیات نوشتن روی فایل هست یا چه چیز دیگه ای) رو داد ، قبل اش رویداد من اجرا بشه و بتونم توی اون رویداد ، اون پروسه ی درخواست کننده را پیدا کنم که اگه پروسه ی برنامه ای اجرا شده (در تسک منیجر) بود و کلا روند و پروسه ی رسمی vss نبود ، همه ی مجوز دسترسی به اون فایل بکاپ را برای همین user جاری ویندوز ، مسدود کنه . بعد دوباره این مجوز را فعال کنم تا سرویس vss بتونه کارهاش رو روش انجام بده (که قبلا کارهای سرویس vss را توضیح داده بودین) .
این کار شدنی هست؟
خیر.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد
استاد ، توی کد زیر :

کد:
    internal struct Setting
    {
        public string test;
    }

و در فرم و رویداد یکی از دکمه ها :

کد:
        private Setting setting;

        private void transpHelp_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
                return;

            setting = new Setting();
            setting.test = "salam";
            this.Method(setting);
          
        }

        private void Method(Setting mySetting)
        {
            string res;
            if (mySetting.test == null)
                res = "null";
            else
                res = mySetting.test;
            MessageBox.Show(res);


            MessageBox.Show(this.setting.Equals(mySetting).ToString());
        }

کد بالا را نوشتم . این پیام آخر ، در متدِ Method ، که مقدارش true هست ، آیا نشون دهنده ی اینه که (با اونکه مقدار شی this.setting که از نوع استراکچر و value type هست و برای پارامتر متد Method فرستاده شد) دو شیِ سراسری this.setting و شی محلی mySetting در متد Method ، هر دو اشاره گر به یک شی هستن؟
اگه آره ، مگه استراکچرها را که میخوایم به متدی ارسال کنیم یا در متغییری بریزیم ، بصورت value type ارسال نمیشن؟ بنابراین مگه موقع ارسال ، در شی جدیدی ریخته نمیشن؟
اگه نه ، پس معناش چیه؟ و مهمتر اینکه چجوری در استراکچرها ، متوجه بشیم که دو شی ، اشاره گر به یک شی هستند یا نه (یا اینکه چجوری میشه در استراکچرها ، آدرس اشاره گرها را در سی شارپ گرفت؟)
خیلی ممنون
 

the_king

مدیرکل انجمن
خیلی ممنون استاد
استاد ، توی کد زیر :

کد:
    internal struct Setting
    {
        public string test;
    }

و در فرم و رویداد یکی از دکمه ها :

کد:
        private Setting setting;

        private void transpHelp_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
                return;

            setting = new Setting();
            setting.test = "salam";
            this.Method(setting);
        
        }

        private void Method(Setting mySetting)
        {
            string res;
            if (mySetting.test == null)
                res = "null";
            else
                res = mySetting.test;
            MessageBox.Show(res);


            MessageBox.Show(this.setting.Equals(mySetting).ToString());
        }

کد بالا را نوشتم . این پیام آخر ، در متدِ Method ، که مقدارش true هست ، آیا نشون دهنده ی اینه که (با اونکه مقدار شی this.setting که از نوع استراکچر و value type هست و برای پارامتر متد Method فرستاده شد) دو شیِ سراسری this.setting و شی محلی mySetting در متد Method ، هر دو اشاره گر به یک شی هستن؟
اگه آره ، مگه استراکچرها را که میخوایم به متدی ارسال کنیم یا در متغییری بریزیم ، بصورت value type ارسال نمیشن؟ بنابراین مگه موقع ارسال ، در شی جدیدی ریخته نمیشن؟
اگه نه ، پس معناش چیه؟ و مهمتر اینکه چجوری در استراکچرها ، متوجه بشیم که دو شی ، اشاره گر به یک شی هستند یا نه (یا اینکه چجوری میشه در استراکچرها ، آدرس اشاره گرها را در سی شارپ گرفت؟)
خیلی ممنون
نه. مقادیر داخل فیلد ها رو با هم مقایسه میکنه، این روال پیشفرض مقایسه در struct ئه. در مورد value type ها Equals بصورت پیشفرض با مقدار کار داره، نه ارجاع.
البته مقایسه پیشفرض Equals نسبت به مقایسه ای که خودتون با override می نوشتید، قطعا مقایسه کندتری است، چون از System.Reflection استفاده میکنه که بررسی اش ذاتا کند ئه.
اگر موارد مقایسه ای که میکنید زیاد ئه، ارزشش رو داره که Equals رو خودتون بنویسید، حتی اگه نتیجه مقایسه همون باشه.
هر زمانی که نیاز به مقایسه ارجاع ها باشه، از object.ReferenceEquals استفاده میشه، اما کلا در مورد value type ها مثل struct ها این مقایسه بی معنی است و نتیجه false ئه چون همون زمان که مقدار پارامتر رو مشخص میکنید، از مقدار اصلی کپی گرفته میشه و هیچوقت خود مقادیر اصلی مقایسه نمیشن، حتی اگر هر دو پارامتر یک متغیر واحد باشن.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد .
پس برای مقایسه ی اشاره گرها ، از متد استاتیک Object. ReferenceEquals استفاده میکنیم .
استاد ، میگم وقتی یه شیِ استراکچری را که باز داخلش استراکچر باشه را داخل یک متغییر (یا متد) دیگه بریزیم (مثلا فرض کنید داخل همین کد پست بالا ، در استراکچرِ Setting ، یه فیلد از نوع استراکچر دستی دیگه هم تعریف میکردیم) :

کد:
    internal struct Setting
    {
        public string test;
        public Set Set;
    }

    internal struct Set
    {

    }

و در فرم :

کد:
        private Setting setting;

        private void transpHelp_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
                return;

            setting = new Setting();
            setting.test = "salam";
            setting.Set = new Set();
            this.Method(setting);
            //
        }

        private void Method(Setting mySetting)
        {
            string res;
            if (mySetting.test == null)
                res = "null";
            else
                res = mySetting.test;
            MessageBox.Show(res);

       
            MessageBox.Show(object.ReferenceEquals(this.setting.Set, mySetting.Set).ToString());
        }

هر نوع استراکچری که داخلِ اون استراکچر هم باشن (مثل فیلد از نوع استراکچر Set که داخل استراکچر Setting هست) هم مقدارش در حافظه ی جدید ، کپی میشه . درسته؟

------------------------------

ادامه :

و اینکه استاد ، همونطور که در تاپیک "سئوالاتی درباره ی sql" ، عکسی از تنظیمات نرم افزارم گذاشته بودم :

1-jpg.112883


اولا حالا میخوام اینها را همانطور که قبلا گفته بودین ، در استراکچری در سی شارپ ، پیاده سازی کنم . به این صورت که یه استراکچری بنام "Setting" بسازم و خودش دو تا فیلد از نوع کلاس های "Program" و کلاس "Interace" (این "Interace" ، نام کلاس هست . ربطی به اینترفیس در سی شارپ نداره) رو که بعدا میسازم توی این استراکچر Setting بذارم .
حالا ، در بخش "پشتیبانگیری" ، همونطور که در تصویر بالا میبینید ، به ازای هر درایو ، باید یک گزینه از نوع bool (برای همون گزینه ی "فعال کردن بکاپ گیری اتوماتیک ...") و یک گزینه از نوع int (برای ذخیره کردن عددی که در شی numericupdown در گروه "پشتیبانگیری اتوماتیک" هست) و همچنین یک گزینه ی دیگه ای از نوع bool (برای همون گزینه ی "مدیریت خودکار حداکثر فضای ذخیره سازی ...") و همچنین باز هم یک گزینه ی دیگه از نوع int دیگه (برای ذخیره کردن عددی که در شی numericupdown در گروه "ذخیره سازی پشتیبان ها" هست) داشته باشم .

به نظرتون برای ذخیره سازی اینها ، از چی استفاده کنم؟ :
1) از اشیاهایی مثل دیکشنری
2) یک کلاس دیگه ای بسازم که یک فیلد از نوع DriveInfo و دو فیلد از نوع بولین و دو فیلد از نوع int (که بولین و int را در بالا توضیح دادم که برای چی میخوام) بسازم و پروپرتی یا فیلدی از آرایه ای از این کلاس را در کلاس Program استفاده کنم .

خودم روش دوم رو میپسندم و فکر میکنم اصولی تر باشه . شما هم همین روش را پیشنهاد میکنین یا روش دیگه ای را پیشنهاد میدین؟

بعد اینکه من هیچ کار نکرده ، الان نرم افزار رو که اجرا میکنم و فرم تنظیمات را باز میکنم ، 50 مگ از حافظه ی رم رو اشغال میکنه . حتی فرم تنظیمات را که میبندم هم حافظه ای که اشغال کرد را آزاد نمیکنه (با وجود dispose کردن) . بخاطر چی هست؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
هر نوع استراکچری که داخلِ اون استراکچر هم باشن (مثل فیلد از نوع استراکچر Set که داخل استراکچر Setting هست) هم مقدارش در حافظه ی جدید ، کپی میشه . درسته؟
غیر از این حالت که نمیتونه رخ بده.
به نظرتون برای ذخیره سازی اینها ، از چی استفاده کنم؟ :
1) از اشیاهایی مثل دیکشنری
2) یک کلاس دیگه ای بسازم که یک فیلد از نوع DriveInfo و دو فیلد از نوع بولین و دو فیلد از نوع int (که بولین و int را در بالا توضیح دادم که برای چی میخوام) بسازم و پروپرتی یا فیلدی از آرایه ای از این کلاس را در کلاس Program استفاده کنم .
کلاس ساختن در هر صورت بهتره مگر اینکه نخواهید از مزایای کلاس استفاده کنید. struct معمولا مزیتی نخواهد داشت.
اگر قراره بر اساس فیلدی جستجو بشه با Dictionary و کلاس شما به عنوان Value ولی در سایر صرفا لیست یا آرایه ای از اشیاء کلاس.
بعد اینکه من هیچ کار نکرده ، الان نرم افزار رو که اجرا میکنم و فرم تنظیمات را باز میکنم ، 50 مگ از حافظه ی رم رو اشغال میکنه . حتی فرم تنظیمات را که میبندم هم حافظه ای که اشغال کرد را آزاد نمیکنه (با وجود dispose کردن) . بخاطر چی هست؟
اولا Dispose کردن به معنای آزاد شدن فوری حافظه نیست، ثانیا 50 مگابایت حافظه زیادی نیست، ثالثا لابد با کتابخانه و تم گرافیکی حجم حافظه مورد نیاز رو قدری بالاتر بردید.
 

جدیدترین ارسال ها

بالا