DataObject クラス
アセンブリ: System.Security (system.security.dll 内)
構文
解説
DataObject クラスを使用して、情報またはメタデータを直接 XML 署名に格納します。たとえば、署名の生成日または署名者の ID を格納できます。DataObject クラスは、XML 署名によってカバーされる場合もあればカバーされない場合もあります。
このクラスは、XML 署名に関する W3C (World Wide Web Consortium) 仕様の <Object> 要素に対応しています。W3C 仕様の詳細については、http://www.w3.org/TR/xmldsig-core/ を参照してください。
エンベロープの XML 署名を生成する方法を次のコード例に示します。
Imports System Imports System.IO Imports System.Security.Cryptography Imports System.Security.Cryptography.Xml Imports System.Xml _ Public Class XMLdsigsample1 Shared Sub Main(args() As [String]) ' Create example data to sign. Dim document As New XmlDocument() Dim node As XmlNode = document.CreateNode(XmlNodeType.Element, "", "MyElement", "samples") node.InnerText = "This is some text" document.AppendChild(node) Console.Error.WriteLine("Data to sign:") Console.Error.WriteLine() Console.Error.WriteLine(document.OuterXml) Console.Error.WriteLine() ' Create the SignedXml message. Dim signedXml As New SignedXml() Dim key As RSA = RSA.Create() signedXml.SigningKey = key ' Create a data object to hold the data to sign. Dim dataObject As New DataObject() dataObject.Data = document.ChildNodes dataObject.Id = "MyObjectId" ' Add the data object to the signature. signedXml.AddObject(dataObject) ' Create a reference to be able to package everything into the ' message. Dim reference As New Reference() reference.Uri = "#MyObjectId" ' Add it to the message. signedXml.AddReference(reference) ' Add a KeyInfo. Dim keyInfo As New KeyInfo() keyInfo.AddClause(New RSAKeyValue(key)) signedXml.KeyInfo = keyInfo ' Compute the signature. signedXml.ComputeSignature() ' Get the XML representation of the signature. Dim xmlSignature As XmlElement = signedXml.GetXml() Console.WriteLine(xmlSignature.OuterXml) End Sub 'Main End Class 'XMLdsigsample1
using System; using System.IO; using System.Security.Cryptography; using System.Security.Cryptography.Xml; using System.Xml; public class XMLdsigsample1 { static void Main(String[] args) { // Create example data to sign. XmlDocument document = new XmlDocument(); XmlNode node = document.CreateNode(XmlNodeType.Element, "", "MyElement", "samples"); node.InnerText = "This is some text"; document.AppendChild(node); Console.Error.WriteLine("Data to sign:\n" + document.OuterXml + "\n"); // Create the SignedXml message. SignedXml signedXml = new SignedXml(); RSA key = RSA.Create(); signedXml.SigningKey = key; // Create a data object to hold the data to sign. DataObject dataObject = new DataObject(); dataObject.Data = document.ChildNodes; dataObject.Id = "MyObjectId"; // Add the data object to the signature. signedXml.AddObject(dataObject); // Create a reference to be able to package everything into the // message. Reference reference = new Reference(); reference.Uri = "#MyObjectId"; // Add it to the message. signedXml.AddReference(reference); // Add a KeyInfo. KeyInfo keyInfo = new KeyInfo(); keyInfo.AddClause(new RSAKeyValue(key)); signedXml.KeyInfo = keyInfo; // Compute the signature. signedXml.ComputeSignature(); // Get the XML representation of the signature. XmlElement xmlSignature = signedXml.GetXml(); Console.WriteLine(xmlSignature.OuterXml); } }
#using <System.dll> #using <System.Xml.dll> #using <System.Security.dll> using namespace System; using namespace System::IO; using namespace System::Security::Cryptography; using namespace System::Security::Cryptography::Xml; using namespace System::Xml; int main() { // Create example data to sign. XmlDocument^ document = gcnew XmlDocument; XmlNode^ node = document->CreateNode( XmlNodeType::Element, "", "MyElement", "samples" ); node->InnerText = "This is some text"; document->AppendChild( node ); Console::Error->WriteLine( "Data to sign:\n{0}\n", document->OuterXml ); // Create the SignedXml message. SignedXml^ signedXml = gcnew SignedXml; RSA^ key = RSA::Create(); signedXml->SigningKey = key; // Create a data object to hold the data to sign. DataObject^ dataObject = gcnew DataObject; dataObject->Data = document->ChildNodes; dataObject->Id = "MyObjectId"; // Add the data object to the signature. signedXml->AddObject( dataObject ); // Create a reference to be able to package everything into the // message. Reference^ reference = gcnew Reference; reference->Uri = "#MyObjectId"; // Add it to the message. signedXml->AddReference( reference ); // Add a KeyInfo. KeyInfo^ keyInfo = gcnew KeyInfo; keyInfo->AddClause( gcnew RSAKeyValue( key ) ); signedXml->KeyInfo = keyInfo; // Compute the signature. signedXml->ComputeSignature(); // Get the XML representation of the signature. XmlElement^ xmlSignature = signedXml->GetXml(); Console::WriteLine( xmlSignature->OuterXml ); }
import System.*; import System.IO.*; import System.Security.Cryptography.*; import System.Security.Cryptography.Xml.*; import System.Xml.*; public class XmlDsigSample1 { public static void main(String[] args) { // Create example data to sign. XmlDocument document = new XmlDocument(); XmlNode node = document.CreateNode(XmlNodeType.Element, "", "MyElement", "samples"); node.set_InnerText("This is some text"); document.AppendChild(node); Console.get_Error().WriteLine("Data to sign:\n" + document.get_OuterXml() + "\n"); // Create the SignedXml message. SignedXml signedXml = new SignedXml(); RSA key = RSA.Create(); signedXml.set_SigningKey(key); // Create a data object to hold the data to sign. DataObject dataObject = new DataObject(); dataObject.set_Data(document.get_ChildNodes()); dataObject.set_Id("MyObjectId"); // Add the data object to the signature. signedXml.AddObject(dataObject); // Create a reference to be able to Reference reference = new Reference(); reference.set_Uri("#MyObjectId"); // Add it to the message. signedXml.AddReference(reference); // Add a KeyInfo. KeyInfo keyInfo = new KeyInfo(); keyInfo.AddClause(new RSAKeyValue(key)); signedXml.set_KeyInfo(keyInfo); // Compute the signature. signedXml.ComputeSignature(); // Get the XML representation of the signature. XmlElement xmlSignature = signedXml.GetXml(); Console.WriteLine(xmlSignature.get_OuterXml()); } //main } //XmlDsigSample1
Imports System Imports System.Security.Cryptography Imports System.Security.Cryptography.Xml Imports System.IO Imports System.Xml _ Public Class Verify Public Shared Sub Main(args() As [String]) Console.WriteLine(("Verifying " + args(0) + "...")) ' Create a SignedXml. Dim signedXml As New SignedXml() ' Load the XML. Dim xmlDocument As New XmlDocument() xmlDocument.PreserveWhitespace = True xmlDocument.Load(New XmlTextReader(args(0))) Dim nodeList As XmlNodeList = xmlDocument.GetElementsByTagName("Signature") signedXml.LoadXml(CType(nodeList(0), XmlElement)) If signedXml.CheckSignature() Then Console.WriteLine("Signature check OK") Else Console.WriteLine("Signature check FAILED") End If End Sub 'Main End Class 'Verify
using System; using System.Security.Cryptography; using System.Security.Cryptography.Xml; using System.IO; using System.Xml; public class Verify { public static void Main(String[] args) { Console.WriteLine("Verifying " + args[0] + "..."); // Create a SignedXml. SignedXml signedXml = new SignedXml(); // Load the XML. XmlDocument xmlDocument = new XmlDocument(); xmlDocument.PreserveWhitespace = true; xmlDocument.Load(new XmlTextReader(args[0])); XmlNodeList nodeList = xmlDocument.GetElementsByTagName("Signature"); signedXml.LoadXml((XmlElement)nodeList[0]); if (signedXml.CheckSignature()) { Console.WriteLine("Signature check OK"); } else { Console.WriteLine("Signature check FAILED"); } } }
#using <System.dll> #using <System.Security.dll> #using <System.Xml.dll> using namespace System; using namespace System::Security::Cryptography; using namespace System::Security::Cryptography::Xml; using namespace System::IO; using namespace System::Xml; int main() { array<String^>^args = System::Environment::GetCommandLineArgs(); Console::WriteLine( "Verifying {0}...", args[ 1 ] ); // Create a SignedXml. SignedXml^ signedXml = gcnew SignedXml; // Load the XML. XmlDocument^ xmlDocument = gcnew XmlDocument; xmlDocument->PreserveWhitespace = true; xmlDocument->Load( gcnew XmlTextReader( args[ 1 ] ) ); XmlNodeList^ nodeList = xmlDocument->GetElementsByTagName( "Signature" ); signedXml->LoadXml( safe_cast<XmlElement^>(nodeList[ 0 ]) ); if ( signedXml->CheckSignature() ) { Console::WriteLine( "Signature check OK" ); } else { Console::WriteLine( "Signature check FAILED" ); } }
System.Security.Cryptography.Xml.DataObject
プラットフォーム
Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。
参照
DataObject クラス
アセンブリ: System.Windows.Forms (system.windows.forms.dll 内)
構文
<ClassInterfaceAttribute(ClassInterfaceType.None)> _ Public Class DataObject Implements IDataObject, IDataObject
[ClassInterfaceAttribute(ClassInterfaceType.None)] public class DataObject : IDataObject, IDataObject
[ClassInterfaceAttribute(ClassInterfaceType::None)] public ref class DataObject : IDataObject, IDataObject
DataObject は IDataObject インターフェイスを実装し、そのメソッドは形式に依存しないデータ転送のための機構を提供します。
DataObject は、通常 Clipboard と共に使用されたり、ドラッグ アンド ドロップ操作で使用されたりします。DataObject クラスは、IDataObject インターフェイスの推奨される実装を提供します。独自に IDataObject を実装するのではなく、DataObject クラスを使用することをお勧めします。
異なった形式の複数のデータを DataObject に格納できます。データは、そのデータに関連付けられている形式によって、DataObject から取得されます。データを取り出す側のアプリケーションの形式が不明なので、DataObject のデータを複数の形式にしておくと、アプリケーションのデータが適切な形式になる可能性が高くなります。定義済みの形式については、DataFormats のトピックを参照してください。DataFormats.Format クラスのインスタンスを作成することにより、独自の形式を実装できます。
DataObject にデータを格納するには、データをコンストラクタに渡すか、SetData を呼び出します。同じ DataObject に複数の形式でデータを追加できます。追加するデータがネイティブ形式だけで取得されるようにする場合は、autoConvertパラメータを false に設定して SetData(String,Boolean,Object) を呼び出します。
データは GetData と互換性のある任意の形式で DataObject から取得できます。たとえば、テキストは Unicode に変換できます。データが格納されている形式でデータを取得するには、autoConvert パラメータを false に設定して GetData を呼び出します。
データがどの形式で格納されているかを判断するには、GetFormats を呼び出します。形式を使用できるかどうかを判断するには、目的の形式で GetDataPresent を呼び出します。
Microsoft .NET Framework version 2.0 では、DataObject クラスに、共通の形式のデータを簡単に処理できるようにする追加メソッドが用意されています。特定の形式のデータを DataObject に追加するには、SetText などの適切な SetFormat メソッドを呼び出します。DataObject から特定の形式のデータを取得するには、まず適切な ContainsFormat メソッド (ContainsText など) を呼び出して DataObject にその形式のデータが含まれているかどうかを確認します。DataObject にそのデータが含まれている場合は、次に適切な GetFormat メソッド (GetText など) を呼び出してデータを取得します。
メモ |
---|
クリップボードでメタファイル形式を使用する場合には、特別な配慮が必要な場合があります。DataObject クラスの現在の実装における制限により、.NET Framework で使用されるメタファイル形式は、旧メタファイル形式を使用するアプリケーションでは認識されない場合があります。この場合は、Win32 クリップボード アプリケーション プログラミング インターフェイス (API: Application Programming Interface) で相互運用する必要があります。詳細については、http://support.microsoft.com にある Microsoft サポート技術情報の文書 323530 (「Metafiles on Clipboard Are Not Visible to All Applications」) を参照してください。 クリップボードに格納するには、オブジェクトはシリアル化可能である必要があります。シリアル化の詳細については、「シリアル化」を参照してください。対象のアプリケーションが、非常に限定されたデータ形式を必要とする場合は、シリアル化プロセスでデータにヘッダーを追加すると、アプリケーションがデータを認識できない場合があります。データ形式を維持するには、データを Byte 配列として MemoryStream に追加し、その MemoryStream を SetData メソッドに渡します。 |
DataObject にデータを追加するコード例を次に示します。まず、新しい DataObject が作成されて、その中にコンポーネントが格納されます。次に、DataObject に適切な種類のデータが存在するかどうかを調べます。結果はテキスト ボックスに表示されます。このコードでは、textBox1 が作成されていることが必要です。
Private Sub AddMyData3() ' Creates a component to store in the data object. Dim myComponent As New Component() ' Creates a new data object. Dim myDataObject As New DataObject() ' Adds the component to the DataObject. myDataObject.SetData(myComponent) ' Prints whether data of the specified type is in the DataObject. Dim myType As Type = myComponent.GetType() If myDataObject.GetDataPresent(myType) Then textBox1.Text = "Data of type " & myType.ToString() & _ " is present in the DataObject" Else textBox1.Text = "Data of type " & myType.ToString() & _ " is not present in the DataObject" End If End Sub 'AddMyData3
private void AddMyData3() { // Creates a component to store in the data object. Component myComponent = new Component(); // Creates a new data object. DataObject myDataObject = new DataObject(); // Adds the component to the DataObject. myDataObject.SetData(myComponent); // Prints whether data of the specified type is in the DataObject. Type myType = myComponent.GetType(); if(myDataObject.GetDataPresent(myType)) textBox1.Text = "Data of type " + myType.ToString() + " is present in the DataObject"; else textBox1.Text = "Data of type " + myType.ToString() + " is not present in the DataObject"; }
private: void AddMyData3() { // Creates a component to store in the data object. Component^ myComponent = gcnew Component; // Creates a new data object. DataObject^ myDataObject = gcnew DataObject; // Adds the component to the DataObject. myDataObject->SetData( myComponent ); // Prints whether data of the specified type is in the DataObject. Type^ myType = myComponent->GetType(); if ( myDataObject->GetDataPresent( myType ) ) { textBox1->Text = String::Concat( "Data of type ", myType, " is present in the DataObject" ); } else { textBox1->Text = String::Concat( "Data of type ", myType, " is not present in the DataObject" ); } }
private void AddMyData3() { // Creates a component to store in the data object. Component myComponent = new Component(); // Creates a new data object. DataObject myDataObject = new DataObject(); // Adds the component to the DataObject. myDataObject.SetData(myComponent); // Prints whether data of the specified type is in the DataObject. Type myType = myComponent.GetType(); if (myDataObject.GetDataPresent(myType)) { textBox1.set_Text("Data of type " + myType.ToString() + " is present in the DataObject"); } else { textBox1.set_Text("Data of type " + myType.ToString() + " is not present in the DataObject"); } } //AddMyData3
DataObject に格納されているデータを取得する例を次に示します。まず、テキスト データを含む新しい DataObject が作成されます。次に、そのデータが取得され、形式が文字列に指定されてテキスト ボックスに表示されます。データ形式は自動的にテキストから文字列に変換されます。このコードでは、textBox1 が作成されていることが必要です。
Private Sub GetMyData2() ' Creates a new data object using a string and the text format. Dim myDataObject As New DataObject(DataFormats.Text, "Text to Store") ' Prints the string in a text box. textBox1.Text = myDataObject.GetData("System.String").ToString() End Sub 'GetMyData2
private void GetMyData2() { // Creates a new data object using a string and the text format. DataObject myDataObject = new DataObject(DataFormats.Text, "Text to Store"); // Prints the string in a text box. textBox1.Text = myDataObject.GetData("System.String").ToString(); }
System.Windows.Forms.DataObject
プラットフォーム
Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。
参照
- DataObject クラスのページへのリンク