createobject関数(Ver9.35対応版)
目次−
COMの呼び出し−
createobject関数−
.net 5, .net core系
管理者による登録なしでの作成(.net 5, .net core系)
.net 5, .net core 3.1でCOMとして公開可能でIDispatchに対応したDLLを作成している場合、末尾に.comhost.dllというファイル名のDLLも同時に生成されます。
例えばSample.dllというDLL本体があった場合、Sample.comhost.dllというDLLがセットでできます。
V8.97以降では、.comhost.dllというファイル名が付いたDLLは、
C++等のネイティブコードと同じ互換性のある形式で扱うことが可能です。
例:
#obj=createobject(@"C:\Folder\Sample32.comhost.dll","{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}");
例:
#obj=createobject(@"C:\Folder\Sample64.comhost.dll","{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}");
DLL側でIDispatchに対応するには、以下の条件を満たす必要があります。
- csprojのプロジェクト設定で、<EnableComHosting>True</EnableComHosting>にする。
- COMとして公開するクラスに[ComVisible(true)]を付ける。
- COMとして公開するメソッドは、以下のようにpublicを付ける。
public int TestMethod(){ ...ここに関数のコード... }
public string TestMethod2(){ ...ここに関数のコード... }
- 秀丸エディタ32bit版向けには対象プラットフォームをx86にする。
例えばSample.dllのDLL本体がAnyCPUであっても、.comhost.dllのほうはアンマネージDLLで、32bit/64bitが一致している必要があります。
- 参考:
public interface ... でインターフェースを作る場合は、[InterfaceType(ComInterfaceType.InterfaceIsDual)]または[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]にする必要があります。
public interfaceは必ずしも必要ではないようで、public classのみでも可能です。
サンプル
GUIDのxxxx...の部分には、guidgenから生成する独自のGUIDを指定してください。
test.cs
using System;
using System.Runtime.InteropServices;
namespace TestCOMServer
{
[ComVisible(true)]
[Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
public class TestServer
{
public int TestMethod()
{
return 123;
}
}
}
test.mac
#obj = createobject( @"C:\Folder\TestCOMServer.comhost.dll", "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" );
message str(member(#obj, "TestMethod" ));