MonoTouch - System.Reflection.Emit.ModuleBuilder error - iphone

I am trying to test my app in IPhone (IOS 5) and I get the following error. It works in simulator without any issues.
I am referencing an external library (NewtonSoft.Json.Monotouch.dll) which seems to be using System.Reflection.Emit.ModuleBuilder. Is there a way to overcome this issue? Any help regarding this is much appreciated.
" -r "/Developer/MonoTouch/usr/lib/mono/2.1/System.dll" -r "/Developer/MonoTouch/usr/lib/mono/2.1/System.Xml.dll" -r "/Developer/MonoTouch/usr/lib/mono/2.1/System.Core.dll" -r "/Developer/MonoTouch/usr/lib/mono/2.1/monotouch.dll" -r "/Developer/MonoTouch/usr/lib/mono/2.1/System.Runtime.Serialization.dll" -r "/Developer/MonoTouch/usr/lib/mono/2.1/System.Web.Services.dll" -r "/Users/test/application/libraries/Newtonsoft.Json.MonoTouch.dll" -linksdkonly -sdk "5.0" Framework is: /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk
Copied
/Users/test/application/bin/iPhone/Release/Unleashed.app
Could not link assemblies: Mono.Linker.ResolutionException: Can not resolve reference: System.Reflection.Emit.ModuleBuilder
Thanks
UPDATE:
Alright, I downloaded the latest NewtonSoft.Json source code from link, compiled the project and dropped the dll into my project. I still have the same issue. I did figure out the class that refers to System.Reflection.Emit. It is DynamicWrapper class in the Utilities folder.
I saw a similar issue posted in another blog link. The responded to the question suggests to set the Liner behavior to "Link all assemblies". Can anyone explain how to set this?

Newtonsoft.Json.MonoTouch.dll is known to work with MonoTouch. I've seen/compiled many application using it myself.
It's likely that you are either using an old or a mis-compiled version of assembly (e.g. missing defines). Difficult to say which without knowing it's origin. Try to track a newer version (or edit your question to include where it comes from).
Note: The fact that it works with the simulator is because a different mscorlib.dll is used to allow JITting (instead of AOTing) the managed code. This allows the simulator builds to be much faster than device builds.

Instead of compiling the Newtonsoft.Json.MonoTouch.dll, which did not work for me either, I downloaded the source code from github and added the project to my solution in MonoTouch and compiled the solution. Only then everything worked. (and of course as popou mentioned do not forget the MONOTOUCH;NET35;SILVERLIGHT options.)

Related

dyld: Library not loaded; llbuild image not found

I used swift package init --type executable.
I have already tried setting xcode command line tools on path.
Following error occurs:
dyld: Library not loaded: #rpath/llbuild.framework/Versions/A/llbuild
Referenced from:
/Library/Developer/CommandLineTools/usr/bin/swift-package Reason:
image not found
I had to go into the preference for xcode and under Locations, set Command Line Tools to the correct version. It was blank when I first opened it.
I have faced the similar issue.
Basically the framework or library is not properly linked in the project.
If you are doing drag and drop of framework in xcode project then you will have to link it in embed frameworks as well.
(Basically you will have to drag and drop the framework in embed frameworks section)
See the below image.
There was this bad config in bash_profile /Library/Developer/CommandLineTools/usr/bin for path. Just removed it. Fixed the problem. which swift should result in /usr/bin/swift.
I had the same problem. I wanted to do some simple command line coding but didn't want to install the full Xcode bloat. I installed only the Command Line Tools on Mojave 10.14.6.
I could call swiftc to compile a file from the command line which actually did everything I needed it to. (I can't remember where I found a reference to being able to do this but basically you just call 'swiftc filename.swift' and you're good.)
But it irritated me that coding the "proper" way (i.e. the way most of the tutorials on the Internet want you to) failed. The "swift package init..." stuff kept barfing with the error posted in the question above here. So I got obsessed with fixing it.
So the error says that swift-package can't find a tool called llbuild.
I found that the llbuild executable did actually exist on my machine at:
/Library/Developer/CommandLineTools/usr/lib/swift/pm/llbuild/llbuild.framework/
The error, then, is because swift-package isn't looking for the tool in that directory.
(As a side note, earlier in my quest to fix this error, I tried adding some paths to my .bash_profile. None of those attempts worked. I can't recall now if I ever tried adding that full path and I'm too lazy to try now.)
I did some more digging. Someone somewhere on the Internet pointed out that the #rpath (referenced in the error message) variable set in apps can be discovered with otools. I used otools on swift-package and found its #rpath seemed to be pointing to /usr/lib. I noticed there was a .../usr/lib/... structure in the location of llbuild mentioned above. I imagined that swift-package was looking in /usr/lib instead of the directory where the file actually was. So I linked the directory where llbuild really is into the /usr/lib directory and voila! It worked.
Most people who need to do this will likely know how to do a symlink of a directory, but just to be thorough, this is what solved the problem for me all as root or use sudo if you want:
cd /usr/lib
ln -s /Library/Developer/CommandLineTools/usr/lib/swift/pm/llbuild/llbuild.framework/ .
Note that trailing period there. That's necessary.
As a side note, I had System Integrity Protection turned on, which forbids making symlinks in /usr/lib, so I had to reboot and turn SIP off from the recovery login(reboot and hold down Command-R) before I could do this.
Also, note that none of this necessarily cured the underlying problem I had of being able to actually build swift packages from the command line--I could now use "swift package init" but I couldn't use "swift run" or do anything else useful. I posted this only to give others some clues when they go digging since I looked a lot of places and didn't have much luck.

Xcode upgrade: PBXContainerItemProxy missing containerPortal key

I just upgraded my Xcode, now when I try to open my project, I get this error:
Project /Users/xxx/xxxx/xxxxx/xxxxxx/xxxxxxxx.xcodeproj cannot be opened: PBXContainerItemProxy (xxxxxxxxxxxxxxxxx) is missing a containerPortal key
I have searched the web and stackoverflow, but cannot get anything relevent to come up at all regarding this.
I do have Three20 as part of my project, I don't know if that matters. I just upgraded to xcode 4.4.1
Thanks for any insight.
-D
the project icon which we see i.e projectname.xcodeproj, is actually a directory, you do this
1. in terminal do cd yourproject.xcodeproj
2.ls
3.vi project.pbxproj
4. scroll down till /* Begin PBXContainerItemProxy section */
5.there you will see all sections check for the section which is missing a portal key edit it and save it :wq it will work
in image if you see the first section is missing container portal key.just pic it from other section and replace it..
it will work :D see this link
Now I should start with that I do not know the actual error, never seen it before, but I did find a reference to a "PBXContainerProxy"-error in this post (As soon as I add a project to XCode 4.0.2 it crashes) and thought you might try the solutions from there?
"Apparently this is due to the new version of XCodeProjects. I found a
work around by pre-compiling the library that was causing the issue
and then using the linker to link to the .a file. I also had to copy
the .a library into the DerivedData path.
The real solution was to remove the project and replace it with an
updated project for the new version of XCode."
Hope that helps somewhat :)
Never saw that error either, but if you're upgrading directly from XCode 3.X I'd suggest you to go to https://developer.apple.com/downloads/index.action?name=Xcode
and download/install a previous version of Xcode somewhere else. (You can have several different copies installed on your machine, just google it if you don't know how but just remember to use xcode-select to pick the one you want to use). Repeat with all the versions back to 4.0.1 until (hopefully) it works. I know it's tedious but it might help.
If it does, validate the project settings and try to open it with 4.4.1. That should work.
Good luck

iOS Devtools.Core Framework pbxcp missing in Xcode?

I downloaded the Doomclassic Source Code and wanted to have a look at it. First I wanted to compile it to see if it actually works. So I followed the instructions and copied the .wad files into the base folder, openend the project and hit compile. Aside from the over 300 warnings and the missing files (mostly Images, which I mostly fixed) I have a strange error during teh compile phase and google is no help at all.
It says:
/Users/tobias/Library/Developer/Xcode/DerivedData/Doom-egfadrxunamfwjdsdaylawcyppkc/Build/Intermediates/Doom.build/Debug-iphonesimulator/Doom.build/Script-435F41A90F532CA300887552.sh: line 3: /Applications/Xcode.app/Contents/Developer/Library/PrivateFrameworks/DevToolsCore.framework/Resources/pbxcp: No such file or directory
When I check my Xcode.app the only framework in the PrivateFrameworks folder is IDEBundleInjection.framework
I also had a look at the script:
!/bin/sh -x
PBXCP=${DEVELOPER_DIR}/Library/PrivateFrameworks/DevToolsCore.framework/Resources/pbxcp
${PBXCP} -exclude .svn "${PROJECT_DIR}/../../base" "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/"
So it seems that I need this framework - but even with google I couldn't find it and I wouldn't know how to integrate it into the Xcode App? I have updated Xcode to 4.4 just now but it's still the same error.
Does anyone has any advice please?
The pbxcp command was removed from XCode 4.4, so you'll have to find a replacement for it. See this mailing list thread to alternatives to the command.

DYLD_INSERT_LIBRARIES and iPhone

I understand that Apple doesn't support using dynamic libraries in iPhone applications. But we are working on a in-house application and we have a unique requirement to use the dynamic libraries. Our requirement is to load a dynamic library as part of "iPhone" application start up. I read that DYLD_INSERT_LIBRARIES is meant for this purpose. So I edited the Info.plist and added below entry.
LSEnvironment
DYLD_INSERT_LIBRARIES
#executable_path/sample.dylib
But it does not seem to be working. Can you please let me know your thoughts ? Really appreciate your help in this regard.
Thanks
--Neo
I've found a way to successfully add LC_LOAD_DYLIB load command to a MachO binary using optool.
$ optool install -c load -p "#executable_path/<dylib_path>" -t <executable>
$ otool -L <executable>
When building optool, make sure that build setting OTHER_LDFLAGS includes -ObjC.
optool does not seem to be able to successfully add load commands for arm64 architectures, so you may want to remove arm64 from the binary
$ lipo <input_file> -remove arm64 -output <output_file>
Edit:
There is an open pull request with support for arm64.
I also working on the same problems for last few days. I also didn't succeed to do it the way you try. So I try to launch my app from another app using this link:
Dynamic Library injection
,unfortunately Apple Block running multiple tasks (even on iphone simulators) but you can try maybe you will have more luck. I know its not a answer you expect but maybe it will give you some way to think. Please share if you have some progress.
You "could" load a binary at runtime and you can manipulate xcode settings to make it compile dylibs for iOS. See this answer:
https://stackoverflow.com/a/10509453/784387
Happy to be corrected, but dylibs are not supported and will not work. You need to get the code for the libraries and compile them into a static lib for the arm6/7 architecture. Then you can easily include these libs. There are plenty of examples of static libs and XCode also provides targets for building them.

Can't compile Three20 template on iOS4

I pulled the latest version of three20 from github and installed their template. I opened it up in XCode, built it, ran it, then I realized the template isn't iOS4 ready.
The first issue I found was "Base SDK not found". I solved it in Edit Project Setting by changing the Base SDK to "iOS Device 4.1".
Then I ran it again. I got tons of errors related to "Three20/Three.h: No such file or directory". I added the "../three20/src" to my Header Search Paths but it doesn't help.
Does anyone know why? What else should I change?
FYI:
XCode Version 3.2.4
Latest version of three20 (29 September)
Directories:
xcode/myproject/
xcode/three20/
PS: the template works fine in SDK 3.0
I was pulling my hair out as well since adding three20 correctly to your new iOS4 with really basic instructions listed here: http://github.com/facebook/three20 did not work as well.
Issue: Can compile newly three20 to your iOS project and got this error: Can't find #import "Three20/Three20.h".
Here is the best solution for those have the same issue:
1) Add your three20 to your iphone project path like this:
[yourProjectPath]/[iOSProjectName]/three20/..
2) cd three20 dir
3) run:
python src/scripts/ttmodule.py -p [yourProjectPath]/[iOSProjectName]/[iOSProjectName].xcodeproj Three20 -c Debug -c Release
4) go to XCode and do a build now.
Thanks to jverkoey for adding this in ...man
u save us a lot of headache if u ever read this :- ) kudos bud! :- )
http://github.com/facebook/three20/commit/0814b1c149cbe987557c88a271f999c3f9f3ae64
Please vote this answers if it help u. Thanks :-)
Turn out I have to use http://github.com/ECP/three20 instead .
An answer I got from twitter - "need to manually set build target of each projects"
He might be right.
My solution was to add the following to the Header Search Path in Xcode:
three20/Build/Products/three20
Xcode 4 screen shot:
Yours may be different of course, but maybe this will help someone.
Also, try checking the Deployment Target under Project Settings, for both, Simulator and Device. In my case, I got thousands of errors because the target was set to 2.2. It seems there is no support for 2.2 anymore in iOS 4.1 and Xcode 3.2.4.