[Mono-list] Could not lookup zero argument constructor for class Ninject.StandardKernel
    mimi 
    zachary.xu at jomediainc.com
       
    Wed Mar  4 19:04:41 UTC 2015
    
    
  
@RobertJordan: After receiving your msg, I did more analyses. Here is the c#
code:
namespace ClassLibrary1
{
    public class Class1
    {
        Class2 mClass2 = new Class2();
        public Class1() { Console.WriteLine("Class1 constructor called!\n");
}
        public void GreetPeople(string sInput1, string sInput2)
        {
            Console.WriteLine(sInput1 + "\n");
            StandardKernel instanceStandardKernel = new StandardKernel();
            mClass2.HelloWorld(sInput2 + "\n");
        }
    }
}
I tested it in Visual Studio and it works. Then I embedded it to my c++
code:
        MonoDomain * domain = mono_jit_init_version ("Domain",
"v4.0.30319");
        MonoAssembly * assembly = NULL;
        assembly = mono_domain_assembly_open (domain,
"/Users/mac1/Downloads/zachary/TestLib/libs/TestZachary/ClassLibrary1.dll");
        MonoImage * image = NULL;
        image = mono_assembly_get_image(assembly);
        MonoClass* classHandle = NULL;
        classHandle = mono_class_from_name(image, "ClassLibrary1",
"Class1");
        MonoObject* instanceClass1 = NULL;
        instanceClass1 = mono_object_new(domain, classHandle);
        if (!instanceClass1)
        {
            printf("Get object error\n");
        }
        else
        {
            printf("Get object successfully\n");
        }
        mono_runtime_object_init(instanceClass1);
        const char* descAsString =
"ClassLibrary1.Class1:GreetPeople(string,string)";
        MonoMethodDesc* description =
mono_method_desc_new(descAsString,true);
        MonoMethod* method = mono_method_desc_search_in_class(description,
classHandle);
        if (!method)
        {
            printf("method is NULL\n");
        }
        else
        {
            printf("Get method successfully\n");
        }
        void* args[2];
        args[0] = mono_string_new(domain, "Greeting from a good friend!");
        args[1] = mono_string_new(domain, "Hello My Mono World!");
        mono_runtime_invoke(method, instanceClass1, args, NULL);
        printf("Here we are, Cool!\n");
        mono_jit_cleanup(domain);
The following are console outputs:
Debugging starts
Get object successfully
Class1 constructor called!
Get method successfully
Greeting from a good friend!
Unhandled Exception:
System.ArgumentNullException: Argument cannot be null.
Parameter name: path1
  at System.IO.Path.Combine (System.String path1, System.String path2)
[0x00000] in <filename unknown>:0 
  at Ninject.Modules.ModuleLoader+<>c__DisplayClassb.<NormalizePaths>b__a
(System.String baseDirectory) [0x00000] in <filename unknown>:0 
  at
System.Linq.Enumerable+<CreateSelectIterator>c__Iterator10`2[System.String,System.String].MoveNext
() [0x00000] in <filename unknown>:0 
  at
System.Linq.Enumerable+<CreateSelectManyIterator>c__Iterator12`2[System.String,System.String].MoveNext
() [0x00000] in <filename unknown>:0 
  at
System.Linq.Enumerable+<CreateSelectManyIterator>c__Iterator12`2[System.String,System.String].MoveNext
() [0x00000] in <filename unknown>:0 
  at
System.Linq.Enumerable+<CreateGroupByIterator>c__Iterator5`2[System.String,System.String].MoveNext
() [0x00000] in <filename unknown>:0 
  at Ninject.Modules.ModuleLoader.LoadModules (IEnumerable`1 patterns)
[0x00000] in <filename unknown>:0 
  at Ninject.KernelBase.Load (IEnumerable`1 filePatterns) [0x00000] in
<filename unknown>:0 
  at Ninject.KernelBase..ctor (IComponentContainer components,
INinjectSettings settings, Ninject.Modules.INinjectModule[] modules)
[0x00000] in <filename unknown>:0 
  at Ninject.KernelBase..ctor (Ninject.Modules.INinjectModule[] modules)
[0x00000] in <filename unknown>:0 
  at Ninject.StandardKernel..ctor (Ninject.Modules.INinjectModule[] modules)
[0x00000] in <filename unknown>:0 
  at ClassLibrary1.Class1.GreetPeople (System.String sInput1, System.String
sInput2) [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentNullException: Argument
cannot be null.
Parameter name: path1
  at System.IO.Path.Combine (System.String path1, System.String path2)
[0x00000] in <filename unknown>:0 
  at Ninject.Modules.ModuleLoader+<>c__DisplayClassb.<NormalizePaths>b__a
(System.String baseDirectory) [0x00000] in <filename unknown>:0 
  at
System.Linq.Enumerable+<CreateSelectIterator>c__Iterator10`2[System.String,System.String].MoveNext
() [0x00000] in <filename unknown>:0 
  at
System.Linq.Enumerable+<CreateSelectManyIterator>c__Iterator12`2[System.String,System.String].MoveNext
() [0x00000] in <filename unknown>:0 
  at
System.Linq.Enumerable+<CreateSelectManyIterator>c__Iterator12`2[System.String,System.String].MoveNext
() [0x00000] in <filename unknown>:0 
  at
System.Linq.Enumerable+<CreateGroupByIterator>c__Iterator5`2[System.String,System.String].MoveNext
() [0x00000] in <filename unknown>:0 
  at Ninject.Modules.ModuleLoader.LoadModules (IEnumerable`1 patterns)
[0x00000] in <filename unknown>:0 
  at Ninject.KernelBase.Load (IEnumerable`1 filePatterns) [0x00000] in
<filename unknown>:0 
  at Ninject.KernelBase..ctor (IComponentContainer components,
INinjectSettings settings, Ninject.Modules.INinjectModule[] modules)
[0x00000] in <filename unknown>:0 
  at Ninject.KernelBase..ctor (Ninject.Modules.INinjectModule[] modules)
[0x00000] in <filename unknown>:0 
  at Ninject.StandardKernel..ctor (Ninject.Modules.INinjectModule[] modules)
[0x00000] in <filename unknown>:0 
  at ClassLibrary1.Class1.GreetPeople (System.String sInput1, System.String
sInput2) [0x00000] in <filename unknown>:0 
Debugging has finished
My understanding is that, in Visual Studio, 'new StandardKernel()' invokes
the first ctor of StandardKernal class without passing anything and it
works.
    public class StandardKernel : KernelBase
    {
        public StandardKernel(params INinjectModule[] modules) :
base(modules)
        {
        }
        public StandardKernel(INinjectSettings settings, params
INinjectModule[] modules) : base(settings, modules)
        {
        }
        ......
    }
For Mono, if I insert 'mono_runtime_object_init(instanceStandardKernel)', we
are trying to execute  default argument-less ctor of StandardKernel that
doesn't exist and I got the error which is normal.
Here, how Mono will parse 'new StandardKernel()'? Default ctor or first ctor
without passing anything? Are error messages I got related to this? 
Thanks!
Zachary
--
View this message in context: http://mono.1490590.n4.nabble.com/Could-not-lookup-zero-argument-constructor-for-class-Ninject-StandardKernel-tp4665563p4665568.html
Sent from the Mono - General mailing list archive at Nabble.com.
    
    
More information about the Mono-list
mailing list