1

.net Compact Frameworkで記述され(Windows CEで実行される)アプリケーションがあり、理論的にはWindows Embedded Standard O / Sと互換性がある場合、OpenNETCF機能を使用しても互換性がありますか?

たとえば、OpenNETCFを使用して.exeファイルを実行するようなものです。OpenNETCFは内部でP/Invokeを使用しているため、アプリケーションがWindowsCE以外のOSと互換性がなくなる可能性があると想定しています。

コードでP/Invokeを使用していませんが、OpenNETCFが使用しているかどうかを確認できません。

.net CompactFramework2.0およびWindowsEmbeddedStandard

4

2 に答える 2

2

OpenNETCFはP/Invokeを広範囲に使用します。

これは、Windows CEおよびその派生物の一部のコアOS機能のラッパーであり、CompactFrameworkには実装されていません。実際には、これはcoredll.dllの広範なP/Invokingを意味します。WindowsCEの基本的なOSモジュール。

WindowsEmbeddedStandardはWindowsXPです。このため、OpenNETCFを使用できるとは思いません。

使用しているバージョンによっては、ここでOpenNETCFコードを入手して(またはもちろん最新のものを購入して)、内部で何が起こっているかを確認できる場合があります。また、OpenNETCFに対して行っている呼び出しは、WindowsEmbeddedStandard用にコンパイルするときに実際に実装されていることがわかります。

これに取り組む1つの方法は、まったく同じコードファイルを含み、OpenNETCFへの参照がない、このプラットフォームをターゲットとする別のプロジェクトを作成してから、コンパイルエラーを修正することです。

条件付きコンパイルシンボルをCEプロジェクトまたはWindowsEmbeddedプロジェクトのいずれかに追加して、次のようなエラーを修正できます(この例は、OpenNETCF用ではありませんが、アイデアは得られます)。

    public static string ExecutingAssembly
    {
        get
        {
#if WindowsCE
            return Assembly.GetExecutingAssembly().GetName().CodeBase;
#else
            return Assembly.GetExecutingAssembly().Location;
#endif
        }
    }

明らかに、出力されるアセンブリが異なるため、プラットフォームごとにビルドを作成する必要があります。

于 2011-05-25T23:10:02.583 に答える
2

クリスが指摘するように、SDFはcoredll P/Invokesを多用します。それはすべてがそうだと言っているわけではありませんが、それは確かに地雷原です。私はCFプロジェクトとFFXプロジェクトを持っている傾向があり、重複している場所では、次のようにエイリアシングを使用します。

#if WindowsCE
using Thread = OpenNETCF.Threading.Thread2;
#else
using Thread = System.Threading.Thread;
#endif

次に、コードで通常の操作を行います

var thread = new Thread(...);

そして、物事はうまくいきます。

何年も前に、デスクトップ用のcoredll「shim」を作成するという興味深いサイドプロジェクトを開始しました。つまり、デスクトップ上の「coredll」へのap / invokeは、実際にはそのDLLを呼び出し、それが次に、kernel32、user32などへの呼び出しをマーシャリングします。私たちが実装したもの(そしてそこにはかなりの部分があります)のテストでは、それがうまく機能することが示されました。したがって、APIの限られたサブセットを使用している場合、それをPCにドロップするだけで、CFアセンブリが「正しく機能する」可能性があります。

于 2011-05-26T02:34:18.547 に答える