locked
Silverlight4におけるマネージコードの呼び出しについて RRS feed

  • 質問

  • VS2010においてSilverlightアプリ(Silverlight4、C#)を作成しています。

    そのアプリ中で、1個ボタンを配置し、それが押されるとアンマネージコードであるコンピュータ名取得APIを

    コールすると例外(下記)が発生してしまいます。DllImportではコンパイルエラーになっていないので、アンマネージコード

    のDllの読み込みには成功しているようなのですが、実際にAPIコール時に例外が投げられるようです。

    ネットでの情報を探してみたのですが、ヒットする情報が得られませんでした。私と同じ状態になっている方はいらっしゃいませんか?

    マネージコードからアンマネージコードをコールするときのセキュリティチェック条件が変わったのでしょうか・・・

    ちなみに同じコンピュータ名を取得する部分をC#のWindowsFormアプリやコンソールアプリでは問題なく動作しましたので

    Silverlight上での実装に何か問題がありそうなのですが・・・

     

    【サンプルコード】

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Runtime.InteropServices;
    using System.Security;
    using System.Text;
    
    (中略)
    
    
    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
      public static extern bool GetComputerName(StringBuilder buffer, ref uint size);
    
    private void button1_Click(object sender, RoutedEventArgs e)
    {
     StringBuilder buffer = new StringBuilder(256);
     uint size = 256;
    
     // API呼び出し
     GetComputerName(buffer, ref size);
    }
    
    

     

    【例外の結果】

     

    System.MethodAccessException はユーザー コードによってハンドルされませんでした。

    Message=Security Transparent メソッド 'SilverlightApplication1.MainPage.button1_Click(System.Object, System.Windows.RoutedEventArgs)' によるメソッド 'SilverlightApplication1.MainPage.GetComputerName(System.Text.StringBuilder, UInt32 ByRef)' を介したネイティブ コードへのアクセスは失敗しました。ネイティブ コードを呼び出すには、メソッドはセキュリティ クリティカルまたはセキュリティ セーフ クリティカルである必要があります。

      StackTrace:

           場所 SilverlightApplication1.MainPage.button1_Click(Object sender, RoutedEventArgs e)

           場所 System.Windows.Controls.Primitives.ButtonBase.OnClick()

           場所 System.Windows.Controls.Button.OnClick()

           場所 System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)

           場所 System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)

           場所 MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, String eventName)

      InnerException: 


     

    2010年7月22日 3:22

回答

  • Silverlight 4 のセキュリティについては下記で公開してくれている情報が一番まとまっててありがたいかな。

    http://d.hatena.ne.jp/mohno/20100512/silverlight

     


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    • 回答としてマーク Silver4 2010年7月27日 4:35
    2010年7月22日 8:35
  • Silverlightがプラットフォームに縛られない動作環境だと期待したのですが、アンマネージコードの過去の資産を活かせないのは少し残念だと感じました・・・

    多くのアンマネージコードは、プラットフォームに縛られています。
    仮に Silverlight でそれを自由に使える状態だと、できあがったものはプラットフォームに縛られたものになります。
    従って「プラットフォームに縛られないkこと」と、「過去の資産をバイナリレベルで活かすこと」は相容れないものと言えるでしょう。

    論理的には納得のできる話ではないでしょうか?
    (ソースコードレベルで部分的に流用することは可能だと思います)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク Silver4 2010年7月27日 4:36
    2010年7月23日 13:59

すべての返信

  • Silverlightはサンドボックス内で実行されるのでセキュリティが厳しく、基本的にアンマネージコードを呼び出せなかったと思います。

    試していませんが、権限昇格機能を使えば 、コンピューター名などを取得できるかもしれません。


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年7月22日 5:22
  • なかむらさん

     

    早速のご回答ありがとうございました。

    Silverlightがアンマネージコードを呼び出せないのは痛いですね・・・

    Windowsプログラミングは初めてなの良く分からないのですが、COMオートメーション

    や権限昇格機能についてもう少し調査して再度、トライしてみます。

    2010年7月22日 5:41
  • Silverlight 4 のセキュリティについては下記で公開してくれている情報が一番まとまっててありがたいかな。

    http://d.hatena.ne.jp/mohno/20100512/silverlight

     


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    • 回答としてマーク Silver4 2010年7月27日 4:35
    2010年7月22日 8:35
  • 小野@どっとねっとふぁん さん

    確かに良くまとまっていました。情報ありがとうございました。教えていただいたファイル中を確認したのですが

    1.5 サンドボックスの実装

    の項で

    これに対し、CriticalSafeCriticalは、ネイティブコード呼び出しのような安全でないことができます。Transparentコードは、Criticalコードを直接呼び出すことはできないため、SafeCriticalはセキュリティの確認が完了した境界レイヤで動作します。」

    と書かれているので、何か方法があるかもしれませんが、そのようなDLL呼び出しを行ってもWindowsでは動作するが、Macでは動かないかも?という意味合いが含まれているのですよね?たぶん・・・

    Silverlightがプラットフォームに縛られない動作環境だと期待したのですが、アンマネージコードの過去の資産を活かせないのは少し残念だと感じました・・・

    それ以外の項目では素晴らしい開発環境なのですが。。。

    2010年7月23日 0:28
  • Silverlightがプラットフォームに縛られない動作環境だと期待したのですが、アンマネージコードの過去の資産を活かせないのは少し残念だと感じました・・・

    多くのアンマネージコードは、プラットフォームに縛られています。
    仮に Silverlight でそれを自由に使える状態だと、できあがったものはプラットフォームに縛られたものになります。
    従って「プラットフォームに縛られないkこと」と、「過去の資産をバイナリレベルで活かすこと」は相容れないものと言えるでしょう。

    論理的には納得のできる話ではないでしょうか?
    (ソースコードレベルで部分的に流用することは可能だと思います)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク Silver4 2010年7月27日 4:36
    2010年7月23日 13:59
  • Azuleanさん

     

    そうですね。アンマネージコードを使ってしまうと、その時点で他OSでは互換がなくなってしまいますね。

    ご回答ありがとうございました。

     

    2010年7月27日 4:35