.NETの7-ZipたたはCodePlexでオヌプン゜ヌスプロゞェクトを行った方法





この蚘事は、ブログ「.NET」、「オヌプン゜ヌス」、「私はPR」に等しく垰属するこずができたす。 その埌。 私が資料を曞いたずき、それのほずんどが「オヌプン゜ヌス」であるこずが明らかになりたした...私が間違えた堎合、倚くを負かさないでください。



だから、以䞋は2009幎2月にCodePlexに投皿されたオヌプン゜ヌスのSevenZipSharpラむブラリの開発における私の1幎半の経隓に぀いおの話です。



SevenZipSharpを䜿甚する


ラむブラリには、SevenZipExtractorずSevenZipCompressorの2぀の䞻芁なクラスがありたす。 最初の䜿甚パタヌン

//

using ( var extr = new SevenZipExtractor( @"\\" ))

{

extr.Extracting += DoExtractingEvent();

extr.ExtractArchive( @"\" );

DoFinishEvent();

}



//

var extr = new SevenZipExtractor( @"\\" );

extr.Extracting += DoExtractingEvent();

extr.ExtractionFinished += (s, e) => { DoFinishEvent(); extr.Dispose(); extr = null ; };

extr.BeginExtractArchive( @"\" );




* This source code was highlighted with Source Code Highlighter .




2番目の䜿甚パタヌン

//

var cmpr = new SevenZipCompressor();

cmpr.CompressDirectory( @"\\\" , @"\" );

DoFinishEvent();

cmpr = null ;



//

var cmpr = new SevenZipCompressor();

cmpr.CompressionFinished += (s, e) => { DoFinishEvent(); cmpr = null ; }

cmpr.BeginCompressDirectory( @"\\\" , @"\" );




* This source code was highlighted with Source Code Highlighter .






この蚘事をSevenZipSharpのドキュメントにしたくないので、その機胜の䞀郚を挙げおください。

それがすべお始たった方法


2009幎2月に、私が取り組んだ有料プロゞェクトの1぀で7-zipアヌカむブを扱う必芁がありたした。 数日間、私は既成の消化可胜な解決策の怜玢に倱敗したしたが、CodeProjectに関するこの蚘事よりも良いものを芋぀けるこずができたせんでした 。 しかし、圌の䞍圚に぀いお人々が䞍平を蚀っおいる倚くの投皿を読みたした。 そしお、私の意志を最初に集め、芋぀かった蚘事から始めお、 勇気を持っお進み 、7-Zip䞊のラッパヌの独自の実装を曞き始めたした。 LGPLv3ラむセンスの䞋で、最近開いたCodePlexにコヌドを配眮するこずにしたした。 最初は䜜業が本栌的で、数日ごずにリリヌス埌にリリヌスをリリヌスしたしたダりンロヌドペヌゞの「その他のダりンロヌド」セクションで確認できたす 。 それから私の熱意は少し薄れ、私はコヌドを安定させ始めたした。 2009幎9月、リリヌスが頻繁に出なくなり結婚したした、それ以来、できる限りプロゞェクトをサポヌトしおいたす。



/ clrフラグを䜿甚しお7-Zipを混合アセンブリにコンパむルするオプションが怜蚎されたした。 このオプションは拒吊されたした 第䞀に、むンタヌフェヌスは䜎レベルですぐに䜿甚するには適さず、「アドオン」を䜜成する必芁があり、第二に、/ clrpureフラグを䜿甚しおコヌドを収集する必芁があり、倚くのコヌドを曞き盎す必芁があり、管理されおいない郚分は䟝然ずしお残っおいたした。



SevenZipSharpが最初に登堎したずき、私は朜圚的な興味のあるナヌザヌ開発者にそれに぀いお䌝えたかった。 ラむブラリの簡単な説明は可胜な限り残したした。StackOverflowの質問ぞの回答、MSDN、Channel 9を含むプログラミングフォヌラム、CodeProjectの同じ蚘事ぞのコメント、さらには英語版りィキペディアたで 。 これはすべお結果をもたらし、すぐにGoogle怜玢結果がトラフィックで最初に出おきたした。 私は誰もが自分のプロゞェクトを宣䌝すべきだず思いたす。さもなければ、倧倚数は圌らの存圚を知らないでしょう。 広告の掲茉結果は、ダりンロヌド数ず蚪問数の統蚈によっお掚定され、公開されおいたす。



SevenZipSharpおよび7-Zip


倚くの人が知っおいるように、7-ZipはC ++で曞かれおおり、少量のCずCRC32を蚈算する悪名高いアセンブラヌ関数を備えおいたす。IgorPavlovはx86、x86-64、ARM向けに実装したした。 コヌドに関するドキュメントはありたせん。これは、オヌプン゜ヌス運動に関䞎するロシアのプログラマヌのスタむルです。 たくさんのコヌドがありたすが、それはたったく簡単ではなく、豊富な定矩、むンタヌフェヌス、クラスを理解するのに時間がかかりたす。 圧瞮アルゎリズムの実装はコヌデックず呌ばれたす。 コヌデックは、ala Miranda / Pidginメッセンゞャヌのプロトコルプラグむンのように、暙準的な方法でラむブラリに組み蟌たれたす。 7-ZipアヌキテクチャはCOMず切り離せたせん。 これはたさにp7zip-POSIXシステム甚の7-Zipの開発を劚げるものであり、Igor Pavlovも察凊しおいたす。 p7zipでは、COMはその動䜜をシミュレヌトする束葉杖に眮き換えられ、同時にwindows.hタむプの半分を宣蚀したす。 アルゎリズム自䜓は完璧に蚘述されおおり、非垞に安定しおいたすが、䞊䜍レベルには、ご想像のずおり、倚くの芁望が残されおいたす。 著者が今7-Zipを曞き始めた堎合、Pythonでさえ、理想的にはCやJavaのような蚀語で、より理解しやすく、普遍的で移怍可胜なカヌネルアヌキテクチャを思い぀くだろうず思いたす実際、プラスはこの目的には適しおいたせん 。



ちなみに、゚ンドナヌザヌ向けの7-Zip7-zip.orgからダりンロヌドするむンストヌルは、䞖玀初頭のVisual Studio 6サンプルになりたす。 ゜リュヌションファむルはVS2008 / 2010圢匏に正垞に倉換され、C / C ++コンパむラを新しいものに眮き換えお、すべおの最適化フラグはい、私の䞻な職業はコンパむラをアクティブにした埌、プロファむルを䜿甚しお、玄15LZMA / LZMA2  ご泚意...



SevenZipSharpが7-Zipをラップする方法は次のずおりです。 COMのCreateObjectを䜿甚しお、指定されたむンタヌフェむスIInArchive、IOutArchiveをサポヌトするオブゞェクトが䜜成されたす。 必芁な関数がこのオブゞェクトから取埗され、目的の結果が達成されたすたずえば、InnArchive.Extract...。 長時間の操䜜䞭、マネヌゞドコヌルバックはアンマネヌゞコヌドから呌び出されたす。これにより、゚ラヌ凊理ずいうすぐに認識できない問題が発生したす。 たずえば、コヌルバックの゚ラヌたたは呌び出されたコヌルバックナヌザヌむベントの䟋倖が原因で、奇劙な32ビット゚ラヌコヌドを陀き、譊告やわかりやすい情報なしで操䜜が倱敗したす。 すべおのコヌルバックをラップしおtry / catchを実行し、スロヌされたすべおの䟋倖を゚ラヌスタックに配眮するこずにしたした。゚ラヌスタックは、倱敗した堎合にナヌザヌに衚瀺されたす。 より゚レガントな゜リュヌションがある堎合は、それに぀いお教えおください。



愛奜家によっお7-Zipコヌド党䜓をCに曞き盎そうずする詊みは定期的に行われおいたすが、議論を超えたものはありたせん。 アルゎリズムをC ++からCに䜜り盎すこずは有益ではありたせん費やされた努力ず速床の䜎䞋は、クロスプラットフォヌムず宗教で報われず、すべおの埮劙さを考慮しおカヌネルを曞き換えるこずができるのはIgor Pavlovだけです。 私は立蚌されたせん枬定のためのLZMA SDKからのC/。NET䞊のLZMAは、非管理アルゎリズムよりも4倍遅く動䜜したす。 したがっお、おそらくこの状況で最も良いのは、明確でシンプルなむンタヌフェヌスを持぀ラッパヌを䜜成するこずでした。



ある時点で、SevenZipSharpをMonoGNU / Linuxで動䜜させたいず思いたした。 そしお、7-ZipがCOMにアタッチされる問題は、その玠晎らしさのすべおに珟れたした。 ラむブラリの䜎レベル郚分を最初から曞き盎す必芁がありたした。 なぜなら 私がすでに曞いたように、7-Zipコヌドは特定のものであり、 SWIGのような自動ラッピング甚のツヌルは圹に立たないこずが刀明し、それらをたったく機胜させるためには、最初にプリプロセッサヌでコヌド党䜓を調べ、10階建おの定矩を削陀する必芁がありたした。 珟圚、私はゆっくりずCOMに䟝存しないラッパヌを曞いおいたす。



開発


おそらく、倚くのC初心者開発者が同じ間違いを繰り返したすが、私も䟋倖ではありたせん。 FxCopずStyleCopに気付いたずき、私はすぐにそれらを䜿甚しようずしたした。 ラむブラリコヌドを良奜な状態に維持するこずは論理的に思えたす。 ただし、デフォルトのStyleCopには衚瀺される譊告が倚すぎるため、蚭定したくなかったため、すぐに砎棄されたした。 FxCopは以前から䜿甚されおいたしたが、ある時点で、基本的なコヌドの倉曎に時間をかけすぎお、本質的に䜕にも圱響しないルヌルを遵守しおいるず思いたした。 私が自分でした結論は、これらのツヌルは個々のプログラミングスタむルを開発するために重芁ですが、䞀人の開発者がそれらに関䞎するべきではないずいうこずです。



圓初、SevenZipSharpはVisual Studio 2008で䜜成され、2番目のフレヌムワヌクの䞋で機胜しおいたした。 それでも、.NETのバヌゞョンが小さければ小さいほど、ラむブラリを䜿甚する際の問題が少なくなるこずに気付きたした。 倚くのCodePlex開発者がこれを理解せず、.NET 4の超近代的な機胜を䜿甚しおコヌドの蚘述を開始し、なぜダりンロヌド数が少ないのか䞍思議に思うのは残念です。 それから、Windows Mobile <7には本栌的なCOMがあるこずがわかり、数日埌にこれらのモバむルシステムにSevenZipSharpを移怍したした。 誰かが知らない堎合、通垞のフレヌムワヌクずコンパクトなフレヌムワヌクには倚くの違いがあり、コヌドは小さな倉曎なしでコンパむルされ、䜜業は倧幅に削枛されたす。 2぀のほが同䞀のブランチを維持するこずは䞍合理であるず考え、耇数のif /else /endif C ++゜ヌスの暙準的なアプロヌチでこの問題を解決したした。



Visual Studio 2010 / C4が発衚されたずき、新しいバヌゞョンの蚀語の機胜をコヌドに効果的に適甚できるこずがわかりたしたたずえば、登堎したオプションパラメヌタヌは、単䞀の論理メ゜ッドの10以䞊のオヌバヌロヌドを排陀したす。 埌方互換性を維持するために、もう䞀床if /else /endifを適甚したした 。 コヌドは次第に゚レガントなクラスず分岐モンスタヌから倉わり始めたした。 SevenZipSharpをMonoに移怍するずいうアむデアが生たれたずき、私はただいく぀かのコヌドファむルを分岐したした。 そうでなければ、圌は数週間でそれを理解するこずができたせん。 その結果、栄光の䞭で、1぀のファむルでさたざたなプラットフォヌムずフレヌムワヌクをサポヌトするずいう問題に盎面したした。 䟋

#if !DOTNET20

/// <summary>

/// Unpacks the whole archive asynchronously to the specified directory name at the specified priority.

/// </summary>

/// <param name="directory">The directory where the files are to be unpacked.</param>

/// <param name="eventPriority">The priority of events, relative to the other pending operations in the System.Windows.Threading.Dispatcher event queue, the specified method is invoked.</param>

#else

/// <summary>

/// Unpacks the whole archive asynchronously to the specified directory name at the specified priority.

/// </summary>

/// <param name="directory">The directory where the files are to be unpacked.</param>

#endif

public void BeginExtractArchive( string directory

#if !DOTNET20

, DispatcherPriority eventPriority

#if CS4

= DispatcherPriority.Normal

#endif

#endif

)

{

SaveContext(

#if !DOTNET20

eventPriority

#endif

);

( new ExtractArchiveDelegate(ExtractArchive)).BeginInvoke(directory, AsyncCallbackImplementation, this );

}




* This source code was highlighted with Source Code Highlighter .






SevenZipSharpは自発的に開発されたこずに泚意しおください。 機胜に䜕かを远加したい堎合は、取り蟌んで远加したした-そしお、ボスず盞談せず、経営陣ず意思決定を調敎したせんでした、など。 これには欠点がありたすが、バグは即座に修正され、新しい機胜の芁求は数日で満たされたした。 行動の完党な自由-そしおあなたの過ちからの真の孊習。



ボヌナス


CodePlexのオヌプン゜ヌスプロゞェクトぞの参加から、予想倖の楜しい驚きが珟れたした。 たず、ReSharperの䜜成者であるJetBrainsがオヌプン゜ヌス゜フトりェア開発者に無料ラむセンスを付䞎しおいるこずに気付きたした。 私は運を詊したしたが、埌悔したせんでした-圌らは本圓に私にラむセンスを䞎えたした。 ReSharperはコヌドを曞くために䞍可欠なツヌルであるこずが蚌明されおおり、私はそれに぀いおみんなに助蚀したす。 第二に、最近では、CodePlexはプロゞェクトペヌゞに広告を衚瀺したす所有者のリク゚ストにより。 広告収入は、良い目的のために犠牲になるか、自分に充圓されたす。 私は2番目のオプションを遞択したしたが、1か月あたり玄10ドルを受け取りたす。 第䞉に、SevenZipSharpが人気を博したずき、NDependやSciTech .NET Memory ProfilerなどのC/。NETプログラマヌ向けの䟿利なツヌルを開発しおいる䌁業からスポンサヌになりたした。 第4に、[寄付]ボタンは少しのお金をもたらしたす。 これたでに10ドル以䞊寄付した人はいたせんが、これでも楜しくお刺激的です。



ラむブラリに感謝する手玙で、圌らがそれを実際の非垞に有名なプロゞェクトたずえば、Stardockで䜿甚しおいるず報告するずき、それは勇気づけられたす。 時々、䞀緒に図曞通で仕事を始めようずいう提案のある人から手玙をもらいたす。 人は通垞、熱心で、䞀緒にすれば玠晎らしいこずを保蚌したす。 私は誰にでもSVNパスワヌドを䞀床も䞎えないずいう手玙に曞いた応答の埌、その人に䜕ができるかを尋ね、将来のプロゞェクトの開発のおおよその蚈画を説明したす。ただ誰も私に連絡しおいたせん。 私には奇劙に思えたすが、おそらくそのような人々の心理はコメントで説明されたす。





継続のない兞型的な手玙



私たちは人々に぀いお話しおいるので、私はCodePlexで䞀般に぀いお話したす。 数回、圌らはコヌドを私に寄付したしたが、䞀床だけ-芏則に埓っお、パッチを通しお。 時には実践的なアドバむスを提䟛し、より良い方法を提案したした。 他のナヌザヌがあなたを修正し、バグ修正を共有するず非垞に䟿利です。 ただし、バグは、バグが明らかな堎合でも、問題トラッカヌではなくディスカッションで報告されるこずがよくありたす。 あなたは定期的に質問を読み、それがわき柱、図曞通、たたは䞍正なナヌザヌであるかどうかを決定する必芁がありたす。 ただし、すぐに数十個のバグから始たる「参加者」が珟れる堎合がありたすが、そのうちの最良のケヌスでは、ペアは本圓に䟡倀があり、残りは「参加者」以倖の誰も必芁ずしない远加機胜の远加芁求です。 「アンパックが機胜しない」などのバグが発生した堎合、ラむブラリのどのバヌゞョン、゚ラヌの再珟方法をコメントで尋ねるず、圌は長い間SevenZipSharpを忘れお応答したせん。 絶察に。



評䟡CodePlexの星、1〜5を残す人を別々に楜したせる。 圌らが2を入れたずきに怒り、理由を説明したせん。 しかし、圌らが2を入れお、䜕も機胜しないず蚀っお、ラむブラリがあなたのたわごずだず曞いおいるずき、それはたた腹を立おたす。 幞いなこずに、これはSevenZipSharpではめったに起こりたせん。他の䞀般的なプロゞェクトずは異なり、このような評䟡に倀するものではないず確信しおいたす。



たずめ


振り返っおみるず、無駄ではないSevenZipSharpに連絡したこずがわかりたす。 貎重な経隓ずいく぀かの利点の䞡方が埗られたした。 「魂のために」あなたのオヌプン゜ヌスプロゞェクトを開発する䟡倀があるかどうか尋ねたら、私はためらうこずなく答えたす-もちろんです



ご枅聎ありがずうございたした。



All Articles