【问题标题】:Hosting CLR - Bad parameters托管 CLR - 参数错误
【发布时间】:2010-09-25 00:09:01
【问题描述】:

我试图在我的 C++ 应用程序中托管 CLR,但在调用托管应用程序的入口点时遇到问题。 入口点像往常一样定义:

static void Main(string[] args)

下面是实际的 C++ 代码:

CComPtr<_MethodInfo> entryPoint;
hr = assembly->get_EntryPoint(&entryPoint); // this works just fine

if (FAILED(hr))
    return hr;

SAFEARRAY *args = 
    SafeArrayCreateVector(VT_VARIANT, 1, 1); // create an array of the length of 1 ( Main(string[]) )

int     argc;
LPWSTR  cmdLine     = GetCommandLineW();
LPWSTR  *argv       = CommandLineToArgvW(cmdLine, &argc); // get an array of arguments to this function

VARIANT vtPsa;
vtPsa.vt         = (VT_ARRAY | VT_BSTR);
vtPsa.parray     = SafeArrayCreateVector(VT_BSTR, 1, argc); // create an array of strings


for (long i = 0; i < argc; i++)
{      
  SafeArrayPutElement(vtPsa.parray, &i, SysAllocString(argv[i])); // insert the string from argv[i] into the safearray
}   

long idx[1] = {0};
SafeArrayPutElement(args, idx, &vtPsa); // insert an array of BSTR into the VT_VARIANT args array

VARIANT obj, result;
VariantInit(&obj);
VariantInit(&result);

try
{
    hr = entryPoint->Invoke_3(obj, args, &result); // call the entry point
}
catch(_com_error ex)
{
    MessageBox(NULL, ex.ErrorMessage(), "Error", 0);
}

if(FAILED(hr))
{
    hr = hr; // added just so I can set a breakpoint
}

我得到的错误代码是-2146233032,根据corerror.h对应:

十进制 -2146233032 / 十六进制 0x80131538 :
COR_E_SAFEARRAYRANKMISMATCH
之间发生了不匹配 数组的运行时秩和秩 记录在元数据中。

谁能看出问题所在?

【问题讨论】:

    标签: c++ clr clr-hosting


    【解决方案1】:

    在这两种情况下,SafeArrayCreateVector 的第二个参数不应该是 0 吗? MSDN 将该值列为“数组的下限。可以是负数。”

    【讨论】:

    • 在两种情况下都将第二个参数设置为 0 后,错误消息更改为:-2147352562 / hex 0x8002000e : COR_E_TARGETPARAMCOUNT corerror.h 提供的参数数量与预期数量不匹配。跨度>
    猜你喜欢
    • 2013-10-28
    • 2011-01-21
    • 2012-10-19
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2011-04-25
    相关资源
    最近更新 更多