Search code examples
c#bindingxamarin.iosmonodevelopcode-behind

Xamarin 'GetNSObject' does not exist in the namespace 'Internal.Runtime'


We have problem with wrapping native obj-c library in Visual Studio on mac. Build generates code-behind for our classes in NativeLibraryWrapperDef.cs but there is some issue with namespaces:

Error CS0234: The type or namespace name 'GetNSObject' does not exist in the namespace 'Internal.Runtime' (are you missing an assembly reference?) (CS0234) (Gmc.Mobile.Sdk.iOS)

Workmate who is using Xamarin studio can build it fine. Anyone else encountered this problem?

using System;
using UIKit;
using Foundation;
using ObjCRuntime;
using Gmc.Mobile.Sdk;
using SafariServices;

namespace Internal.iOS
{
/*
 The first step to creating a binding is to add your native library ("libNativeLibrary.a")
 to the project by right-clicking (or Control-clicking) the folder containing this source
 file and clicking "Add files..." and then simply select the native library (or libraries)
 that you want to bind.

 When you do that, you'll notice that MonoDevelop generates a code-behind file for each
 native library which will contain a [LinkWith] attribute. MonoDevelop auto-detects the
 architectures that the native library supports and fills in that information for you,
 however, it cannot auto-detect any Frameworks or other system libraries that the
 native library may depend on, so you'll need to fill in that information yourself.

 Once you've done that, you're ready to move on to binding the API...


 Here is where you'd define your API definition for the native Objective-C library.

 For example, to bind the following Objective-C class:

     @interface Widget : NSObject {
     }

 The C# binding would look like this:

     [BaseType (typeof (NSObject))]
     interface Widget {
     }

 To bind Objective-C properties, such as:

     @property (nonatomic, readwrite, assign) CGPoint center;

 You would add a property definition in the C# interface like so:

     [Export ("center")]
     CGPoint Center { get; set; }

 To bind an Objective-C method, such as:

     -(void) doSomething:(NSObject *)object atIndex:(NSInteger)index;

 You would add a method definition to the C# interface like so:

     [Export ("doSomething:atIndex:")]
     void DoSomething (NSObject object, int index);

 Objective-C "constructors" such as:

     -(id)initWithElmo:(ElmoMuppet *)elmo;

 Can be bound as:

     [Export ("initWithElmo:")]
     IntPtr Constructor (ElmoMuppet elmo);

 For more information, see http://developer.xamarin.com/guides/ios/advanced_topics/binding_objective-c/

*/

// @interface MRDCState : NSObject <MRDBObject>

[BaseType(typeof(NSObject))]
interface MRDCState : MRDBObject
{
    [Export ("remoteId", ArgumentSemantic.Copy)]
    string RemoteId { get; set; }

    [Export("documentID", ArgumentSemantic.Copy)]
    string DocumentID { get; set; }

    [Export("displayName", ArgumentSemantic.Copy)]
    string DisplayName { get; set; }

    [Export ("isUpdateAvailable", ArgumentSemantic.Copy)]
    bool IsUpdateAvailable { get; set;}

    [Export("lastUpdateDate", ArgumentSemantic.Copy)]
    NSDate LastUpdateDate { get; set; }

    [Export("content", ArgumentSemantic.Copy)]
    string Content { get; set; }

    //@property (nonatomic) int stateTypeFlag;
    [Export ("stateTypeFlag", ArgumentSemantic.Copy)]
    StateType TypeFlag { get; set; }
}

// @interface MRDCAppMessage : NSObject

[Protocol]
[BaseType(typeof(NSObject))]
interface MRAppMessage
{
    // @property NSUInteger messageID;
    [Export("messageID")]
    ulong MessageID { get; set; }

    // @property NSString *documentID;
    [Export("documentID")]
    string DocumentID { get; set; }

    // @property NSString *messageType;
    [Export("messageType")]
    string MessageType { get; set; }

    // @property NSString *payload;
    [Export("payload")]
    string Payload { get; set; }

    // - (instancetype)initWithID:(NSUInteger)messageID documentID:(NSString *)documentID type:(NSString *)messageType payload:(NSString *)payload;
    [Export("initWithID:documentID:messageType:payload:")]
    IntPtr Constructor(ulong messageID, string documentID, string messageType, string payload);
}

Solution

  • Removing internal from Internal.iOS namespace and some fixes with Protocol and Model attributes fixed the issue.