xmlファイルから読み取り、結果を文字列として返すクラスライブラリを作成しました。しかし、COM +コンポーネントとしてインストールしようとすると、エラーが発生しました(エラーコード:80131501)。イベントログを確認しましたが、エラーの詳細は次のとおりです。
'C:\ Users \ User \ Documents \ Visual Studio 2005 \ Projects \ InteropSOA \ InteropSOA \ bin \ Debug \ InteropSOA.dll'の'{28E82165-AD74-4E16-90C9-0C5CE7DA97AA}'へのインストールが例外で失敗しました:システム.EnterpriseServices.RegistrationException:致命的:インストールしたコンポーネント「InteropSOA.ConfigReader」が見つかりませんでした。System.EnterpriseServices.RegistrationDriver.InstallAssembly(RegistrationConfig regConfig、Object obSync)at System.EnterpriseServices.RegistrationHelper.InstallAssemblyFromConfig(RegistrationConfig&regConfig)at System.EnterpriseServices.RegistrationHelper.InstallAssembly(String assembly、String&application、String partition、String&tlb、InstallationFlags installF )at System.EnterpriseServices.Internal.ComManagedImportUtil.InstallAssembly(String asmpath、String parname、String appname)
以下は、クラスライブラリの開発中に行った手順です。
- 参照に「System.EnterpriseServices」を追加しました。
- クラスへの参照をインポートしました。
- クラスを「ServicedComponent」として宣言しました。
- プロジェクトのプロパティを設定します([アセンブリをCOM表示にする]チェックボックスをオンにし、[COM相互運用機能に登録する]チェックボックスをオンにし、強力なキーファイル名でアセンブリに署名します)。
これが私のコードです:
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Xml.XPath;
using System.EnterpriseServices;
namespace InteropSOA
{
public class ConfigReader : ServicedComponent
{
// xml file name
private string strFileName;
// type of request
private string strRequest = "";
// response string
private string strResponse = "";
// declarations for xPath
private XPathDocument doc;
private XPathNavigator nav;
private XPathExpression expr;
private XPathNodeIterator iterator;
private XmlTextReader reader;
private XmlDocument xmlDoc;
public ConfigReader(string strFile, string request)
{
this.strFileName = strFile;
this.strRequest = request;
}
public ConfigReader()
{
//default contructor
}
// reader for console program
public void ReadXML()
{
doc = new XPathDocument(strFileName);
nav = doc.CreateNavigator();
// compile xPath expression
expr = nav.Compile("/Msg/" + strRequest + "/*");
iterator = nav.Select(expr);
// interate on the node set
try
{
while (iterator.MoveNext())
{
XPathNavigator nav2 = iterator.Current.Clone();
strResponse += nav2.Value + "|";
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
strResponse = strResponse.Substring(0, strResponse.Length-1);
Console.WriteLine("Response string = " + strResponse);
}
public void WriteXML(string strRequest, string strElement, string strValue)
{
reader = new XmlTextReader(strFileName);
xmlDoc = new XmlDocument();
xmlDoc.Load(reader);
reader.Close();
XmlNode node;
XmlElement root = xmlDoc.DocumentElement;
node = root.SelectSingleNode("/Msg/" + strRequest + "/" + strElement);
node.InnerText = strValue;
xmlDoc.Save(strFileName);
}
// reader for ASP.NET
public string ReadXMLElement()
{
doc = new XPathDocument(strFileName);
nav = doc.CreateNavigator();
// compile xPath expression
expr = nav.Compile("/Msg/" + strRequest + "/*");
iterator = nav.Select(expr);
// interate on the node set
try
{
while (iterator.MoveNext())
{
XPathNavigator nav2 = iterator.Current.Clone();
strResponse += nav2.Value + "|";
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
strResponse = strResponse.Substring(0, strResponse.Length - 1);
return strResponse;
}
}
}