In the following code
var weakRef = new WeakReference<Action>(inst.DoSomething);
You are not passing an Action defined in the class. You are using compiler sugar to allocate one to pass to the method. It will be auto deallocated after the method call. As the method does not hold a reference (definition of weak reference) the GC will free it. it is the same as:
Action temp = inst.DoSomething; var weakRef = new WeakReference<Action>(temp); temp = null; GC.Collect();
This is different than if the instance defined the action as a property or field. Then the instance life would hold a reference.
Note: Actions are not method pointers, but rather an allocated object with a method reference. It is this object that is going out of scope, not the referenced object.
The solution is to hold a weak ref to the object and use an interface or reflection to call the method or an action method defined in the object.