現在、アプリケーションのプラグイン フレームワークを作成しています。アプリケーションを更新せずにプラグインをリリースできるようにしたいと考えており、フレームワークをサードパーティのプラグインで利用できるようにする予定です。現在、2 つのプラグインが同一のフレームワークで出荷されている場合に問題が発生しています。プラグインがロードされると、フレームワークが 2 回ロードされるため、ランタイムが混乱します。この問題を軽減する最善の方法は何ですか?
1 に答える
2
あなたが何を求めているのかは少し不明確です。プラグインの両方にフレームワークまたは他のサードパーティのフレームワークが含まれているということですか?
両方にフレームワークが含まれている場合は、そのようにすべきではありません。アプリケーションに組み込まれているフレームワークを参照する必要があります。を介してフレームワークバンドルを参照できる@executable_path
ため、アプリケーションに相対的です(例@executable_path/../Frameworks/MyFramework.framework/
)。
Lightroomの例を次に示します。
% otool -L Applications/Adobe\ Lightroom\ 2.app/Contents/PlugIns/Web.lrmodule/Contents/MacOS/Web
Applications/Adobe Lightroom 2.app/Contents/PlugIns/Web.lrmodule/Contents/MacOS/Web:
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 12.0.0)
/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 136.0.0)
@executable_path/../Frameworks/AgSubstrate.framework/Versions/A/AgSubstrate (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)
両方に他のサードパーティのObjective-Cフレームワークが含まれている場合、これはプラグインのバグです。Objective-Cランタイムには名前空間がなく、同じ名前の複数のクラスをロードするときに正常な応答を期待することはできません。これはこの質問で説明されており、ObjC名前空間の衝突に対するいくつかの回避策を提供します。
于 2010-05-04T17:47:46.427 に答える