Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换到接口将抛出InvalidCastException 我使用C++和CLI作为我的C++游戏服务器和(未来的)C插件的中间件。它应该从加载的程序集中加载所有类型,这些程序集实现了一个名为IPlakScript的特定接口,构造它们并将它们的本机接口返回给服务器,它正是这样做的,除了出于某种原因,将对象强制转换为IPlakScript失败,出现InvalidCastException。这是我的密码:_C#_Reflection_C++ Cli - Fatal编程技术网

C# 转换到接口将抛出InvalidCastException 我使用C++和CLI作为我的C++游戏服务器和(未来的)C插件的中间件。它应该从加载的程序集中加载所有类型,这些程序集实现了一个名为IPlakScript的特定接口,构造它们并将它们的本机接口返回给服务器,它正是这样做的,除了出于某种原因,将对象强制转换为IPlakScript失败,出现InvalidCastException。这是我的密码:

C# 转换到接口将抛出InvalidCastException 我使用C++和CLI作为我的C++游戏服务器和(未来的)C插件的中间件。它应该从加载的程序集中加载所有类型,这些程序集实现了一个名为IPlakScript的特定接口,构造它们并将它们的本机接口返回给服务器,它正是这样做的,除了出于某种原因,将对象强制转换为IPlakScript失败,出现InvalidCastException。这是我的密码:,c#,reflection,c++-cli,C#,Reflection,C++ Cli,C++/CLI代码: [2020-05-07 09:34:43] Found some class E:\PlakMP\Sources\Release\plakscript\CSharpGamemodeTest.dll [2020-05-07 09:34:43] IPlakScript mdl E:\PlakMP\Sources\Release\plakscript\PSEsharp.dll [2020-05-07 09:34:43] IMPLEMENTS: PlakMP.IPlakScript

C++/CLI代码:

[2020-05-07 09:34:43] Found some class E:\PlakMP\Sources\Release\plakscript\CSharpGamemodeTest.dll
[2020-05-07 09:34:43] IPlakScript mdl E:\PlakMP\Sources\Release\plakscript\PSEsharp.dll
[2020-05-07 09:34:43] IMPLEMENTS: PlakMP.IPlakScript
[2020-05-07 09:34:43] MEMBER: OnScriptInit Method
[2020-05-07 09:34:43] MEMBER: OnScriptShutdown Method
[2020-05-07 09:34:43] MEMBER: GetType Method
[2020-05-07 09:34:43] MEMBER: ToString Method
[2020-05-07 09:34:43] MEMBER: Equals Method
[2020-05-07 09:34:43] MEMBER: GetHashCode Method
[2020-05-07 09:34:43] MEMBER: .ctor Constructor
[2020-05-07 09:34:43] Found gamemode class CSharpGamemodeTest.TestGamemode
TestGamemode constructed
I'm PlakScript!
[2020-05-07 09:34:43] METHOD: OnScriptInit
[2020-05-07 09:34:43] METHOD: OnScriptShutdown
[2020-05-07 09:34:43] METHOD: GetType
[2020-05-07 09:34:43] METHOD: ToString
[2020-05-07 09:34:43] METHOD: Equals
[2020-05-07 09:34:43] METHOD: GetHashCode
[2020-05-07 09:34:43] PSEsharp exception: System.InvalidCastException: Unable to cast object of type 'CSharpGamemodeTest.TestGamemode' to type 'PlakMP.IPlakScript'.
   at PSManagedWrapper.LoadGamemodeM(String name) in E:\PlakMP\Sources\PSEsharp\PSEsharp.cpp:line 123
公共接口类IPlakScript
{
公众:
void OnScriptInit(服务器^Server);
void OnScriptShutdown();
};
静态IScript*LoadGamemodeM(字符串^name)
{
试一试{
自动组装=组装::LoadFrom(名称);
自动类型=程序集->获取类型();
对于每个(自动输入类型)
{
日志写入(“找到某个类”+t->Module->FullyQualifiedName);
日志写入(“IPlakScript mdl”+IPlakScript::typeid->Module->FullyQualifiedName);
对于每个(在t->GetInterfaces()中自动输入)
日志写入(“实现:”+i->FullName);
对于每个(在t->GetMembers()中自动m)
日志写入(“成员:“+m->Name+”+m->MemberType.ToString());
if(t->GetInterface(“PlakMP.IPlakScript”)//aka实现IPlakScript
{
日志写入(“找到游戏模式类”+t->FullName);
Object ^obj=t->GetConstructor(gcnew cli::array{})->Invoke(gcnew cli::array{});
对于每个(在t->GetMethods()中自动m)
日志写入(“方法:”+m->Name);
IPlakScript^ps=safe_cast(obj);//在这里抛出异常,即使在C#中完全相同的操作也很好:为什么?
返回新脚本(ps);
//ps->OnScriptInit(gcnewplakmp::Server(g_psscriptable));
}
}
}
捕获(异常^e)
{
String^description=“PSEsharp异常:”+e->ToString();
日志写入(描述);
}
返回空ptr;
}
C#代码:

[2020-05-07 09:34:43] Found some class E:\PlakMP\Sources\Release\plakscript\CSharpGamemodeTest.dll
[2020-05-07 09:34:43] IPlakScript mdl E:\PlakMP\Sources\Release\plakscript\PSEsharp.dll
[2020-05-07 09:34:43] IMPLEMENTS: PlakMP.IPlakScript
[2020-05-07 09:34:43] MEMBER: OnScriptInit Method
[2020-05-07 09:34:43] MEMBER: OnScriptShutdown Method
[2020-05-07 09:34:43] MEMBER: GetType Method
[2020-05-07 09:34:43] MEMBER: ToString Method
[2020-05-07 09:34:43] MEMBER: Equals Method
[2020-05-07 09:34:43] MEMBER: GetHashCode Method
[2020-05-07 09:34:43] MEMBER: .ctor Constructor
[2020-05-07 09:34:43] Found gamemode class CSharpGamemodeTest.TestGamemode
TestGamemode constructed
I'm PlakScript!
[2020-05-07 09:34:43] METHOD: OnScriptInit
[2020-05-07 09:34:43] METHOD: OnScriptShutdown
[2020-05-07 09:34:43] METHOD: GetType
[2020-05-07 09:34:43] METHOD: ToString
[2020-05-07 09:34:43] METHOD: Equals
[2020-05-07 09:34:43] METHOD: GetHashCode
[2020-05-07 09:34:43] PSEsharp exception: System.InvalidCastException: Unable to cast object of type 'CSharpGamemodeTest.TestGamemode' to type 'PlakMP.IPlakScript'.
   at PSManagedWrapper.LoadGamemodeM(String name) in E:\PlakMP\Sources\PSEsharp\PSEsharp.cpp:line 123
使用系统;
使用PlakMP;
命名空间CSharpGamemodeTest
{
公共类TestGamemode:IPlakScript
{
公共TestGamemode()
{
Console.WriteLine(“构建的TestGamemode”);
if(这是IPlakScript)//的计算结果为true,因此它不是一个C#问题
WriteLine(“我是PlakScript!”);
}
脚本初始化上的公共无效(服务器)
{
_服务器=服务器;
_LogWrite(“来自C#!!”的你好”;
}
public void OnScriptShutdown()
{
_LogWrite(“从C#!再见”);
}
专用服务器(u Server),;
}
}
日志输出:

[2020-05-07 09:34:43] Found some class E:\PlakMP\Sources\Release\plakscript\CSharpGamemodeTest.dll
[2020-05-07 09:34:43] IPlakScript mdl E:\PlakMP\Sources\Release\plakscript\PSEsharp.dll
[2020-05-07 09:34:43] IMPLEMENTS: PlakMP.IPlakScript
[2020-05-07 09:34:43] MEMBER: OnScriptInit Method
[2020-05-07 09:34:43] MEMBER: OnScriptShutdown Method
[2020-05-07 09:34:43] MEMBER: GetType Method
[2020-05-07 09:34:43] MEMBER: ToString Method
[2020-05-07 09:34:43] MEMBER: Equals Method
[2020-05-07 09:34:43] MEMBER: GetHashCode Method
[2020-05-07 09:34:43] MEMBER: .ctor Constructor
[2020-05-07 09:34:43] Found gamemode class CSharpGamemodeTest.TestGamemode
TestGamemode constructed
I'm PlakScript!
[2020-05-07 09:34:43] METHOD: OnScriptInit
[2020-05-07 09:34:43] METHOD: OnScriptShutdown
[2020-05-07 09:34:43] METHOD: GetType
[2020-05-07 09:34:43] METHOD: ToString
[2020-05-07 09:34:43] METHOD: Equals
[2020-05-07 09:34:43] METHOD: GetHashCode
[2020-05-07 09:34:43] PSEsharp exception: System.InvalidCastException: Unable to cast object of type 'CSharpGamemodeTest.TestGamemode' to type 'PlakMP.IPlakScript'.
   at PSManagedWrapper.LoadGamemodeM(String name) in E:\PlakMP\Sources\PSEsharp\PSEsharp.cpp:line 123
诚然,代码非常糟糕:但是嘿,这是我第一次使用C++/CLI!任何帮助都将不胜感激,提前谢谢


编辑:似乎IPlakScript类型在某个地方定义了两次。我不知道这是怎么发生的:TestGamemode程序集是否使用PSEsharp类型的副本?你的管理C++代码看起来像是重新定义了接口,这很可能是你不能把它转换到PLAKMP.iPLAKScript的原因,或者它不是真的存在,你把它仅仅是为了解释?我不定义它,它是在C++或CLI中单独定义的。显然,C#仍然会选择并允许使用它。别担心,伙计,每一个C++/CLI代码都是一团糟:)你能解释一下这一行吗<代码>对象^obj=t->GetConstructor(gcnewcli::array{})->Invoke(gcnewcli::array{})它获取不带参数的
t
的构造函数,并调用它而不带参数(因此为空数组)。这不是错误的,但是为什么你问?看起来像你的托管C++代码中你重新定义了接口,这很可能是你不能把它转换到PLAKMP.iPLAKScript的原因,或者它不是真的存在,你把它仅仅是为了解释?我不定义它,它是在C++或CLI中单独定义的。显然,C#仍然会选择并允许使用它。别担心,伙计,每一个C++/CLI代码都是一团糟:)你能解释一下这一行吗<代码>对象^obj=t->GetConstructor(gcnewcli::array{})->Invoke(gcnewcli::array{})它获取不带参数的
t
的构造函数,并调用它而不带参数(因此为空数组)。但这不是错误,你为什么要问?