interopを可能にするために、C#で書かれたローカルサーバーをアンマネージコードに公開しようとしています。マネージコードのようになります。管理されたCOMローカルサーバーを公開する - E_NOINTERFACE
[Guid("A0D470AF-0618-40E9-8297-8C63BAF3F1C3")]
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMyLocalInterface
{
void LogToServer(string message);
}
[Guid("9E9E5403-7993-49ED-BAFA-FD9A63A837E3")]
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class MyLocalClass : IMyLocalInterface
{
public MyLocalClass()
{
Console.WriteLine("Object created!");
}
public void LogToServer(string message)
{
Console.WriteLine("Log > " + message);
}
}
class Program
{
[MTAThread]
static void Main(string[] args)
{
var srv = new RegistrationServices();
var cookie = srv.RegisterTypeForComClients(typeof(MyLocalClass), RegistrationClassContext.LocalServer | RegistrationClassContext.RemoteServer, RegistrationConnectionType.MultipleUse);
Console.ReadLine();
srv.UnregisterTypeForComClients(cookie);
}
}
そして、私のアンマネージコードは以下のん:IVEはCoCreateInstanceのは何の問題もなく動作することを見てデバッグした後
#import "ManagedLocServer.tlb" no_namespace raw_interfaces_only
int _tmain(int argc, _TCHAR* argv[])
{
CoInitializeEx(NULL, COINIT_MULTITHREADED);
{
IMyLocalInterfacePtr ptr;
ptr.CreateInstance(__uuidof(MyLocalClass));
ptr->LogToServer(L"Initializing...");
}
CoUninitialize();
return 0;
}
、「作成したオブジェクトは、」に印刷されたことを意味し管理されたサーバーコンソール。しかし、そのオブジェクトのQueryInterfaceはE_NOINTERFACEで失敗します。私は少しこれがなぜ起こる混乱しています。登録に問題がありますか(私はCLSIDのLocalServer32エントリーしか持っていません)?マネージコード内で問題がありますか?誰かが私にヒントを与えることができればいいだろう:)
挨拶 ジョー
'regasm/tlb'を使ってタイプライブラリを作成し、そのタイプライブラリをレジストリに登録しようとすると、オートメーションのマーシャリングが無料になる可能性がありますか? – sharptooth
@sharp - 私は気にしません、そのツールは長い間awolされています。私のマシンでは、regtlibv12.exeという名前で.NET 4.0に戻ってきました。どんなドキュメントでも、/でもない?助け、私はそれが何をしているのか分からない。私はHKCR \ TypeLibに書き込むことを期待していますが、HKCR \ Interfaceに必要なエントリを書くことは、既存の登録を壊す可能性が非常に低いと私を驚かせます。 –