در مورد خطای alphavss هیچ نظری نمیتونم بدم، چون نه صحت یک کد متفرقه رو میشه تایید کرد و نه روال کار شما قاطعانه درسته و نه دلیل خطا مشخصه.
با برنامه ی command line ، دستور create اش گزینه ای نداره که attributes رو مشخص کنه تا بتونیم بگیم بکاپ ها را در سربرگ previous version نشون بده .
دستور یا همون سوئیچ Create رو کی به شما گفته؟ اشکال کار همونجا است. در ویندوز های سرور اون برنامه vssadmin یک سوئیچ create داره، این کاملا مشخصه. در ویندوز های غیر سرور همچین سوئیچی نیست، می توانید در Command Prompt با امتحان کردن دستور
?/ vssadmin لیست فرمان های پشتیبانی شده رو لیست شده ببینید.
هر چند من تا حالا اسم wmi هم نشنیدم و اولین باره دارم میبینم شون و نمیدونم فرق شون با بقیه ی کلاس ها چیه ، با این wmi آشنا شدم که گفتید توی ویندوز غیر سرور ساپورت نمیشه .
حالتون خوبه؟ چرا همه چی رو با هم قاطی پاتی می کنید. اولا WMI کلاس نیست، جزئی از ساختار داخلی ویندوز ئه و ثانیا ربطی هم به پشتیبانی Create در فلان کلاس نداره. از کجای اون لینک
Create به این نتیجه رسیدید که در ویندوز غیر سرور WMI پشتیبانی نمیشه؟ من گفتم WMI در ویندوز غیر سرور پشتیبانی نمیشه؟ WMI از همون ابتدا در ویندوز XP و ویندوز های بعدی بوده و حتی در Windows 98 و Me هم قابل نصبه.
حالا هم واسه همین میخواستم مستقیما برم سر وقت آخرین گزینه یعنی کار با vss api در خود ویندوز .
مثل اینه که بخواهید بازی بسازید، ببینید کار با GameStudio سخته چون هنوز اصول و قواعد GameStudio رو یاد نگرفتید، Unity رو امتحان کنید، ببینید کار با اون سخت تره چون کار با Unity رو هم بلد نیستید، بعد سعی کنید با DirectX کار کنید، بعد ببینید دیگه خیلی سخت شد و اصلا ازش سر در نمیارید چون از ساختار DirectX اطلاعی ندارید، بعد برید سراغ گزینه خیلی سخت تری مثل کار مستقیم با درایور کارت گرافیکی. شما وقتی هنوز شناخت کاملی از VSS و کارکردش ندارید چطور ازش استفاده می کنید؟ خود VSS براتون ناشناخته است، تصوری هم از این ندارید که برای ارتباط مستقیم با VSS از طریق API چقدر حجم کار لازمه، می توانید از طریق API ارتباط برقرار کنید وقتی هنوز خود موضوع براتون جای ابهام داره؟
به نسبت خودم ، جستجوی بدی نکردم و وقت صرف کردم اما بله روی یکی خیلی کمتر و روی یکی بیشتر ولی وقتی به جواب نرسیدم و پیگیر هم کردم و منابع را چک کردم و بازم جواب نگرفتم ، دیگه نمیدونم دلیلش چیه دیگه . بنابراین مجبور میشم برم سروقت یه گزینه ی دیگه .
به جواب نرسیدن که راحت ترین کار ممکنه. روی هر موضوعی که بهش مسلط نباشید می توانید به جواب نرسید. برای کسی که به موضوع مسلط نباشه نصب کردن ویندوز هم به دلایل مختلف به جواب نمیرسه. alphavss یک Wrapper ئه، خودش کار اضافی خاصی انجام نمیده که مستندات مفصلی بخواد، صرفا واسط ئه، یک به یک ساختار VSS رو پیاده سازی کرده. برای کسی که به ساختار VSS مسلط باشه شناخته شده است. شما از VSS چقدر شناخت پیدا کردید؟
نمیدونم چرا برنامه نویس ها روی این موضوع vss بکاپ بسیار کم کار کردن (کلا داخل و خارج منظورمه) . بیشترین منابع ، منابع vss api هست که مشکلش ارتباط سخت سی شارپ با اونه و دومش alphavss هست که بدیش اینه که هم مثال ازش نداره و هم مشکلاتش جایی مطرح شد .
برنامه نویسان روی چه چیزش کار کنند؟ VSS یک سرویس ویندوز ئه برای نگهداری نسخه های پشتیبان. همانطور که Windows Update یک سرویس ویندوز ئه برای آپدیت کردن ویندوز. حالا برنامه نویسان چه کار مشخصی باید با WIndow Update داشته باشند؟ سرویس داره کار خودش رو برای ویندوز انجام میده، ارتباط خاصی با نیاز های برنامه نویس نداره. شما اگر بخواهید از فایل یا پوشه ای نسخه پشتیبان تهیه کنید هم نه محتاج به ShadowCopy هستید و نه مزیتی براتون ایجاد می کنه، ساختن فایل zip که ساده تره. فقط برنامه نویسانی لازم بوده از ShadowCopy استفاده کنند که داشتن نرم افزاری برای مدیریت ShadowCopy و Snapshot هایش بنویسند، مگر چقدر همچین نیازی پیش میاد و درضمن مگر چقدر سطح معلوماتشون پایین بوده که بیان در موردش سوال مطرح کنند. کسی که همچین نرم افزاری رو طراحی می کنه قبلش در مورد ShadowCopy بطور کامل معلوم داره و جای سوالی برایش پیش نمیاد.
یعنی مثل قضیه ی Struct های API که با سی شارپ و در اتوپلی با پلاگین استفاده میکردیم ، در اینجا حالا باید از کلاس Marshall استفاده کنیم؟
دو تا مورد جدا رو قاطی نکنید، مورد اول اینه که یک پارامتری به ساختاری از نوع فلان اشاره کنه که اون فلان یک اینترفیس یا struct یا نوع داده مشخصیه و مورد دوم مدیریت حافظه ای است که Unmanaged ئه و می خواهید از داخل کد #C باهاش کار کنید. Marshal کاری با مورد اول نداره، Marshal به شما امکان میده که ارتباط میان محیط Managed و Unmanaged رو برقرار کنید، مورد دوم.
اون Marshal در خیلی موارد قابل استفاده است، اما در مورد اون struct ها هم شما برای ارجاع به struct از Marshal استفاده نکردید. از Marshal برای مدیریت حافظه استفاده کردید نه ارجاع به struct.
شما در ویژوال استدیو میتوانید ساختار اون اینترفیس هایی که Wrapper یا Type Library داخل کمپوننت ها تعریف کرده رو ببینید، به سادگی بهشون رفرنس داده میشه، اینکار Marshal لازم نداره. #C که برای ارجاع دادن به ساختاری که براش تعریف بشه مشکلی نداره. اما وقتی صحبت تعامل بین حافظه مدیریت شده و نشده میشه گاهی اوقات لازمه از Marshal کمک بگیرید، گاهی اوقات، چون در مواردی بصورت خودکار خود همون DllImport یکسری تعاملات رو انجام میده، اگر انجام نمیداد که نمی توانستید به سادگی پارامتر به متد خارجی بفرستید و دریافت کنید.