(argc == 3))
{
cerr << "Usage: " << argv[0] << " <Assembly Name> <Class Name> <Main
Function Name> <Parameters>" << endl;
}
else
{
spUnk = NULL;
CHECK(spHost->GetDefaultDomain(&spUnk));
spAppDomain = spUnk; spUnk = NULL;
_bstr_t bstrAssemblyName(argv[1]);
if(argc == 2)
{
CHECK(spAppDomain->ExecuteAssembly(bstrAssemblyName, NULL));
}
else
{
_bstr_t bstrClassName(argv[2]),
bstrMainFuncName(argv[3]);
_ObjectHandlePtr spObj =
spAppDomain->CreateInstance(bstrAssemblyName, bstrClassName);
CComPtr<IDispatch> spDisp = spObj->Unwrap().pdispVal;
DISPID dispid;
LPOLESTR rgszName = bstrMainFuncName;
DISPPARAMS dispparamsArgs = {NULL, NULL, 0, 0};
int ArgCount = argc-4;
if(ArgCount > 0)
{
dispparamsArgs.cArgs = ArgCount;
dispparamsArgs.rgvarg = new VARIANTARG[ArgCount];
VARIANTARG *pArgs = dispparamsArgs.rgvarg;
for(int i=0; i<ArgCount; i++)
{
VariantInit(&pArgs[i]);
pArgs[i].vt = VT_BSTR;
pArgs[i].bstrVal = _bstr_t(argv[4+i]);
}
}
CHECK(spDisp->GetIDsOfNames(IID_NULL, &rgszName, 1,
LOCALE_SYSTEM_DEFAULT, &dispid));
CHECK(spDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD,
&dispparamsArgs, NULL, NULL, NULL));
delete[] dispparamsArgs.rgvarg;
}
}
CHECK(spHost->Stop());
return 0;
}
&n
关键词:.Net平台下CLR程序载入原理区分