まず、私はこれをちょっと貨物栽培していると認めます。私が実際の世界にそれを詰め込んでいるとき、私のきれいなサンプルコードはうまくいきません。それは言っている...
私はCPierce.CSharpCall.dllと呼ばれるDLLを持っています。このDLLには、次のようなC#があります。
namespace CPierce.CSharpBridge
{
[System.Runtime.InteropServices.Guid("3D08DF02-EFBA-4A65-AD84-B08ADEADBEEF")]
public interface ICSide
{
//interface definition omitted...
}
[System.Runtime.InteropServices.Guid("CBC04D81-398B-4B03-A3D1-C6D5DEADBEEF")]
public partial class CSide : ICSide
{
//class definition omitted...
}
}
これは regasm/tlb
などで登録されています。そして、私のC ++コードは次のようになります:
#import "CPierce.CSharpCall.tlb" named_guids
//Contains syntax errors!
int myfunc()
{
HRESULT hRes = S_OK;
CoInitialize(NULL);
CPierce.CSharpBridge::ICSide *pManagedInterface = NULL;
hRes = CoCreateInstance(
CPierce.CSharpBridge::CLSID_Class1,
NULL, CLSCTX_INPROC_SERVER,
CPierce.CSharpBridge::ICSide,
reinterpret_cast (&pManagedInterface));
//Calls to the interface omitted....
CoUninitialize();
return 0;
}
問題は、もちろん、 CPierce.CSharpBridge
に関する構文上間違ったビットです。私はC ++で、C#コードと同様の名前空間を使用したいと思うかどうかを知ることができます。
namespace CPierce
{
namespace CSharpBridge
{
//definitions go here
}
}
しかし、私がここで探しているとは思っていません。別の名前空間にある2つの定数を、その名前空間にメソッド全体を入れずに参照するだけでよいからです。
CoCreateInstance
の呼び出しを完了するために必要なC ++構文はあります。
アップデート:より深い(もっと深い)検査では、regasmによって作成された.tlbファイルがほとんど空であることがわかりました。私のソースのすべてを単一の.csファイルにまとめ、コンパイルすると、次のようになります。
csc /debug /t:library BigFile.cs
regasm BigFile.dll /tlb:BigFile.tlb
私はかなりの(そして便利な)tlbファイルを取得します。
私がVisual Studioからプロジェクト全体をコンパイルすると、.DLLは正常ですが、regasmは何もしませんが最小限の.tlbファイルを生成します。 (ildasmは2つのDLLの間にほとんど違いがないことを示しています)
私がVisual StudioでBigFile.csをコンパイルすると、役に立たないDLLが得られます。
私は困惑している。