2022年07月19日
いまさらのCOM
COM は Component Object Model の略
ローカルでCOM登録をするためにVisualStudioは管理者で起動する
ビルドにてCOM相互運用機能の登録にチェックをつける。
アプリケーションのアセンブリ情報で、「アセンブリをCOM参照可能にする」
System.Runtime.InteropServices
公開するインターフェイスの属性に「ComVisible(true)」と記述する
作成したインターフェイスを実装したクラスを作成する
クラスの属性に「 [ClassInterface(ClassInterfaceType.None)]」を定義する
上記の記述ができたら、VBScriptから以下のように実行すれば動作する
NLOGでログ出力するサンプル
◇インターフェイス
◇実装クラス
ローカルでCOM登録をするためにVisualStudioは管理者で起動する
ビルドにてCOM相互運用機能の登録にチェックをつける。
アプリケーションのアセンブリ情報で、「アセンブリをCOM参照可能にする」
System.Runtime.InteropServices
公開するインターフェイスの属性に「ComVisible(true)」と記述する
[ComVisible(true)]
internal interface IComLogger
{
void WriteLog(string log);
}
作成したインターフェイスを実装したクラスを作成する
クラスの属性に「 [ClassInterface(ClassInterfaceType.None)]」を定義する
[ClassInterface(ClassInterfaceType.None)]
public class ComLogger : IComLogger
{
public ComLogger()
{
}
public void WriteLog(string log)
{
}
}
上記の記述ができたら、VBScriptから以下のように実行すれば動作する
Dim logger
Set logger = CreateObject("ClassLibrary.ComLogger") 'namespaseからなのを忘れずに
logger.WriteLog("ログ")
NLOGでログ出力するサンプル
◇インターフェイス
using System.Runtime.InteropServices;
namespace ClassLibrary
{
[ComVisible(true)]
internal interface IComLogger
{
void WriteLog(string log);
}
}
◇実装クラス
using NLog;
using NLog.Config;
using NLog.Targets;
using NLog.Targets.Wrappers;
using System.Runtime.InteropServices;
using System.Text;
namespace ClassLibrary
{
[ClassInterface(ClassInterfaceType.None)]
public class ComLogger : IComLogger
{
static readonly Logger _logger = LogManager.GetCurrentClassLogger();
public ComLogger()
{
var file = new FileTarget("LogFile");
file.Encoding = Encoding.GetEncoding("Shift_JIS");
file.Layout = "${longdate} [${threadid}] [${uppercase:${level}}] ${callsite}() - ${message}";
file.FileName = "${basedir}/logs/${date:format=yyyyMMdd}_debug.log";
file.KeepFileOpen = false; //これをtrueにしているとレスポンスが良いがログが飛んでしまう
file.ArchiveNumbering = ArchiveNumberingMode.Date;
file.ArchiveFileName = "${basedir}/logs/debug.log.{#}";
file.MaxArchiveFiles = 30;
var asyncWrapper = new AsyncTargetWrapper();
asyncWrapper.QueueLimit = 5000;
asyncWrapper.OverflowAction = AsyncTargetWrapperOverflowAction.Grow;
asyncWrapper.WrappedTarget = file;
var conf = new LoggingConfiguration();
conf.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, file));
conf.AddTarget("LogFile", asyncWrapper);
LogManager.Configuration = conf;
}
public void WriteLog(string log)
{
_logger.Info(log);
}
}
}
【このカテゴリーの最新記事】
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/11506516
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック