我有一个托管 CLR 的本机程序(即手动启动它,获取对
AppDomain
的引用等 - 这不是 C++/CLI)。在这种情况下,我想实例化一个 FileStream
对象。据我了解,在这种情况下创建对象的最佳方法是使用反射:
SAFEARRAY* pArgs = SafeArrayCreateVector(VT_VARIANT, 0, 2);
...
BSTR assemblyName = SysAllocString(L"mscorlib");
BSTR typeName = SysAllocString(L"System.IO.FileStream");
pAppDomain->CreateInstance_3(assemblyName, typeName, VARIANT_TRUE, BindingFlags_Default, NULL, pArgs, NULL, NULL, NULL, &result);
这对于我尝试创建的所有其他类型都适用;例如MemoryStream
。但
FileStream
特别让我难住了,似乎是因为
FileStream
期望在其构造函数中输入
Enum
类型(例如
System.IO.FileAccess
)。如果我尝试给它一个
VT_I4
(枚举的基本类型)来代替
FileAccess
参数,它会抱怨它找不到构造函数(
HRESULT
是
COR_E_MISSINGMETHOD
) - 这确实有道理......但鉴于枚举是值类型,没有明显的 VARIANT 类型可供使用。当某些参数是枚举时,有没有办法在使用托管 CLR 的上下文中使用反射来调用任意构造函数/方法?
文件访问_读取 = 1, 文件访问_写入 = 2, 文件访问_读写 = 3
希望有帮助